在某些WebGL应用程序中,我们假设我们有一个GLSL顶点着色器,其开头如下:
attribute vec4 foo1;
attribute vec4 foo2;
attribute vec4 foo3;
attribute vec4 foo4;
以及一些用于绑定这些属性的数据结构的相应Javascript代码:
var buf = gl.createBuffer(), loc;
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([…]));
loc = gl.getAttribLocation(program, 'foo1');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 0);
loc = gl.getAttribLocation(program, 'foo2');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 4);
loc = gl.getAttribLocation(program, 'foo3');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 8);
loc = gl.getAttribLocation(program, 'foo4');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 12);
现在,根据GL ES 2.0规范,顶点着色器属性可以定义为float
,vec2
,vec3
,vec4
,{{1 }},mat2
或mat3
。
因此,如果我更改顶点着色器代码以仅定义一个mat4
属性,就像这样......
mat4
...问题是将一些指针绑定到attribute mat4 foo;
属性的相应JS代码是什么?
我找到了问题mat3 attribute in WebGL,但答案并不明确。阅读答案和其他一些文档,似乎正确的解决方案是:
mat4
我是否正确地假设loc = gl.getAttribLocation(program, 'foo');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc , 4, gl.FLOAT, false, 16, 0);
gl.vertexAttribPointer(loc+1, 4, gl.FLOAT, false, 16, 4);
gl.vertexAttribPointer(loc+2, 4, gl.FLOAT, false, 16, 8);
gl.vertexAttribPointer(loc+3, 4, gl.FLOAT, false, 16, 12);
的4个vec4
组件的位置始终相邻并且按升序排列?这是否记录在某处?
除了这些位置计入mat4
限制(通常是WebGL中的16位)之外,还有其他一些好的做法需要注意吗?
答案 0 :(得分:4)
你是对的。 From the spec第2.10.4节
当属性变量声明为
mat2
时,其矩阵列取自通用属性(x, y)
和i
的{{1}}个组件。当属性变量声明为i + 1
时,其矩阵列将从通用属性mat3
到(x, y, z)
的{{1}}个组件中获取。当属性变量声明为i
时,其矩阵列将从通用属性i + 2
到mat4
的{{1}}个组件中获取。
WebGL中的步幅和偏移以字节为单位,所以我怀疑你想要
(x, y, z, w)
让我们检查一下
i

i + 3

gl.vertexAttribPointer(loc , 4, gl.FLOAT, false, 64, 0);
gl.vertexAttribPointer(loc+1, 4, gl.FLOAT, false, 64, 16);
gl.vertexAttribPointer(loc+2, 4, gl.FLOAT, false, 64, 32);
gl.vertexAttribPointer(loc+3, 4, gl.FLOAT, false, 64, 48);