翻译不适用于所有点

Translations Don't Apply to All Points

考虑以下顶点着色器:

attribute vec4 a_Position;
uniform mat4 u_ModelMatrix;
void main() {
    gl_Position = u_ModelMatrix * a_Position;
    gl_PointSize = 3.0;
}

在我的 Javascript 程序中,我操纵 u_ModelMatrix 进行旋转和平移。这适用于我绘制的三角形。但是我注意到如果我用它自己的顶点缓冲对象绘制第二个对象:

var vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, point, gl.STATIC_DRAW);
gl.uniform4f(u_FragColor, 1,1,0,1);
gl.drawArrays(gl.POINTS, 0, 1);

那么平移和旋转不适用于该对象。我认为它会因为 GLSL 程序中的 gl_Position 是点乘以矩阵。这是我希望发生的事情,但我很好奇为什么会这样?

当您调用 gl.vertexAttribPointer 时,缓冲区会绑定到顶点属性。在您调用 gl.vertexAttribPointer 时绑定到 gl.ARRAY_BUFFER 的任何缓冲区现在都绑定到该属性。上面你正在创建一个新的缓冲区,但是因为没有调用 gl.vertexAttribPointer 你的属性仍然指向你之前附加的任何缓冲区。

是否要替换先前已存在缓冲区的内容或创建新缓冲区由您决定。