mat4在属性着色器中输入

时间:2015-06-12 07:02:28

标签: opengl-es webgl shader

如何使用MAT4类型发送到着色器属性?

attribute mat4 attr;
...

JS:

var attr=gl.getAttribLocation(_program,"attr");

1 个答案:

答案 0 :(得分:2)

From the spec第2.10.4节

  

当属性变量声明为AlertView时,它   矩阵列取自通用属性 i 的( x,y,z,w )组件   通过 i + 3。

所以

JS:

mat4

至于获取数据,最常见的方法是将所有矩阵放在一个缓冲区中,以便

var row0Location = gl.getAttribLocation(_program, "attr");
var row1Location = row0Location + 1;
var row2Location = row0Location + 2;
var row3Location = row0Location + 3; 

然后设置属性

var matrices = new Float32Array(numMatrices * 16);

... // fill out your matrices

gl.bufferData(gl.ARRAY_BUFFER, matrices, gl.STATIC_DRAW);

要注意的事情。如果您正在调试并在着色器中注释掉var floatsPerRow = 4 var bytesPerRow = floatsPerRow * 4; var bytesPerMatrix = bytesPerRow * 4; var row0Offset = bytesPerRow * 0; var row1Offset = bytesPerRow * 1; var row2Offset = bytesPerRow * 2; var row3Offset = bytesPerRow * 3; gl.enableVertexAttribArray(row0Location); gl.vertexAttribPointer(row0Location, floatsPerRow, gl.FLOAT, false, bytesPerMatrix, row0Offset); gl.enableVertexAttribArray(row1Location); gl.vertexAttribPointer(row1Location, floatsPerRow, gl.FLOAT, false, bytesPerMatrix, row1Offset); gl.enableVertexAttribArray(row2Location); gl.vertexAttribPointer(row2Location, floatsPerRow, gl.FLOAT, false, bytesPerMatrix, row2Offset); gl.enableVertexAttribArray(row3Location); gl.vertexAttribPointer(row3Location, floatsPerRow, gl.FLOAT, false, bytesPerMatrix, row3Offset); ,那么attr将为-1并且调用带有-1位置的所有row0Location函数是无操作的,这是好的。但是,因为您计算其他位置gl.vertexAttribrow1Locationrow2Location将是WebGL关注的有效属性位置,但就您的程序而言无效。想要记住的事情并不是什么大事。