WebGL笔记:矩阵平移的数学原理和实现

矩阵平移的数学原理

  • 让向量OA位移
    • x方向,tx
    • y方向,ty
    • z方向,tz
  • 最终得到向量OB


矩阵平移的应用

  • 再比如我要让顶点的x移动0.1,y移动0.2,z移动0.3

1 )顶点着色器核心代码

<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    // 列主序
    mat4 m4 = mat4(
      1.0, 0.0, 0.0, 0.0,
      0.0, 1.0, 0.0, 0.0,
      0.0, 0.0, 1.0, 0.0,
      0.1, 0.2, 0.3, 1.0
    );
    void main() {
     
      gl_Position = m4 * a_Position;
    }
</script>

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  float tx = 0.4;
  float ty = 0.3;
  float tz = 0.2;
  // 列主序
  mat4 m4 = mat4(
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    tx,  ty,  tz,  1.0
  );
  void main() {
     
    gl_Position = m4 * a_Position;
  }
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
  void main() {
     
    gl_FragColor = vec4(1.0,1.0,0.0,1.0);
  }
</script>
<script type="module">
  import {
      initShaders } from './utils.js';

  const canvas = document.getElementById('canvas');
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  const gl = canvas.getContext('webgl');

  const vsSource = document.getElementById('vertexShader').innerText;
  const fsSource = document.getElementById('fragmentShader').innerText;
  initShaders(gl, vsSource, fsSource);

  const vertices = new Float32Array([
    0.0, 0.1,
    -0.1, -0.1,
    0.1, -0.1
  ])

  const vertexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_Position);

  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);
</script>
  • 使用 js 建立矩阵对象,并传递给着色器的方法参考之前博文,此处不再赘述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 15:52:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 15:52:03       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 15:52:03       82 阅读
  4. Python语言-面向对象

    2023-12-07 15:52:03       91 阅读

热门阅读

  1. 【网络安全】下载并安装 kali 的虚拟机 版本

    2023-12-07 15:52:03       71 阅读
  2. 高防CDN:企业网络安全的坚实屏障

    2023-12-07 15:52:03       67 阅读
  3. RPC 简介

    2023-12-07 15:52:03       61 阅读
  4. Docker命令大全简介及示例

    2023-12-07 15:52:03       49 阅读
  5. RabbitMQ常用命令(二)

    2023-12-07 15:52:03       56 阅读
  6. Vue.observable

    2023-12-07 15:52:03       45 阅读
  7. 剑指 Offer(第2版)面试题 19:正则表达式匹配

    2023-12-07 15:52:03       64 阅读
  8. 在Django中使用Q对象和条件运算符来构建动态查询

    2023-12-07 15:52:03       69 阅读
  9. Python环境管理利器-Anaconda介绍与安装

    2023-12-07 15:52:03       61 阅读
  10. Django 中的 HMAC 请求签名校验与 Vue.js 的完美协作

    2023-12-07 15:52:03       62 阅读
  11. AIGC: 关于ChatGPT中API接口调用相关准备工作

    2023-12-07 15:52:03       61 阅读