变换
对图形的平移,就是对图形所有顶点的平移
举个简单的例子
即,如下图
x'=x+tx
y'=y+ty
z'=z+tz
向量的加法
编写向量加法代码
在GLSLES语言里,是直接可以进行向量运算的,下面是顶点着色器里的代码:
attribute vec4 a_Position;
vec4 translation = vec4(0, 0.2, 0, 0);
void main() {
gl_Position = a_Position + translation;
}
基于对初始的这个a_Position 点位进行一个位移的话,那我可以直接让它加上一个四维的向量,就比如这里的这个translation,就是我声明的一个个四四维向量,让它直接加上即可
上述 translation 是写死的 ,我们也可以把 translation 变量暴露出去,让js可以修改图形位置:
<script id="vertexShader" type="x-shader/x-vertex">
attribute vec4 a_Position;
uniform vec4 u_Translation;
void main() {
gl_Position = a_Position + u_Translation;
}
script>
在js 中修改uniform 变量的方法,我们之前已经说过:
// 获取 uniform 变量
const u_Translation = gl.getUniformLocation(gl.program, 'u_Translation');
// 为 uniform 变量赋值
gl.uniform4f(u_Translation, 0, 0.5, 0, 0);
之后,可以加一段逐帧动画:
let y = 0;
!(function animate() {
y += 0.02;
if(y > 1) y = -1;
gl.uniform4f(u_Translation, 0, y, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);
requestAnimationFrame(animate)
})()
完整代码
<canvas id="canvas">canvas>
<script id="vertexShader" type="x-shader/x-vertex">
attribute vec4 a_Position;
uniform vec4 u_Translation;
void main() {
gl_Position = a_Position + u_Translation;
}
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 './util.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);
//获取uniform 变量
const u_Translation = gl.getUniformLocation(gl.program, 'u_Translation');
//为uniform 变量赋值
gl.uniform4f(u_Translation, 0, 0.5, 0, 0);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);
let y = 0
!(function animate() {
y += 0.02;
if (y > 1) y = -1;
gl.uniform4f(u_Translation, 0, y, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);
requestAnimationFrame(animate);
})()
script>