如何将模型矩阵包含到VBO中?

Alv*_*par 2 opengl opengl-es vbo vertex-buffer webgl

我想发送一个缓冲区列表(到GPU /顶点着色器),其中包含有关顶点位置,世界位置,颜色,比例和旋转的信息.

如果我的每个3D对象都有一个矩阵中的变换相关信息,我怎样才能通过VBO将这个矩阵数组(除了其他顶点数据)传递给GPU?

更新 请原谅任何错别字:

// bind & set vertices.
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAtribPointer(a_Position, 3, gl.FLOAT, false, stride, 0);

// bind & set vertex normals.
gl.bindBuffer(gl.ARRAY_BUFFER,, vertexNormalsBuffer);
gl.vertexAttribPointer(a_Normal, 3, gl.FLOAT, false, stride, 0);

// becaue i cant pass in a model matrix via VBO, im tryng to pass in my world coordinates.
gl.bindBuffer(gl.ARRAY_BUFFER, worldPositionBuffer);

// not sure why i need to do this, but most tutorials i've read says to do this.
gl.bindBuffer(gl.ARRAY_BUFFER, null);

// bind & draw index buffer.
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vertexIndexBuffer);
gl.drawElements(gl.TRIANGLES, vertexIndexCount, gl.UNSIGNED_SHORT, 0);
Run Code Online (Sandbox Code Playgroud)

请注意,这些缓冲区(vertexBuffer,vertexNormalsBuffer,worldPostiionBuffer,vertexIndexBuffer),都在我的场景中的所有相应的3D对象(这点我是呈现一个接一个通过属性/制服的串联-一个天真的做法,更简单,更容易把握,但可怕的慢的1000个对象).

Ret*_*adi 7

对于渲染帧时需要经常更改的任何值,将它们作为a attribute而不是a 传递到着色器可能更有效uniform.如果您愿意,还可以将值存储在VBO中.请注意,不需要在VBO中存储属性,也可以使用glVertexAttrib[1234]f()或指定它们glVertexAttrib[1234]fv().

这适用于转换矩阵,就像传入着色器的任何其他值一样.如果它经常变化,你应该把它变成一个属性.在这种情况下唯一的轻微皱纹是我们处理矩阵,属性必须是向量.但这很容易克服.通常作为a传入的内容mat4可由3个类型的值表示vec4,其中这3个向量是矩阵的列向量.它当然是4个向量来表示完全通用的4x4矩阵,但是变换矩阵中的第4列不用于任何常见的变换类型(投影矩阵除外).

如果您希望转换在VBO中,则可以设置3个以上的属性,就像您已经为位置和颜色所做的那样.存储在VBO中的属性值是相应变换矩阵的列向量.

然后在顶点着色器中,通过计算变换属性向量与输入位置的点积来应用变换.代码可能如下所示:

attribute vec4 InPosition;
attribute vec4 XTransform;
attribute vec4 YTransform;
attribute vec4 ZTransform;
main() {
    vec3 eyePosition = vec3(
        dot(XTransform, InPosition),
        dot(YTransform, InPosition),
        dot(ZTransform, InPosition));
    ...
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以在完整的OpenGL中解决这个问题,比如使用统一缓冲区对象.但对于WebGL和OpenGL ES 2.0,我认为这是最好的解决方案.