翻译并不适用于所有点

问题描述:

考虑以下顶点着色器:翻译并不适用于所有点

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是将点乘以矩阵。这就是我想要发生的事情,但我只是好奇为什么会出现这种情况?

+1

也许这只是为了举例说明,但如果不是这样,那么缓冲区创建和drawArrays调用一起出现的事实至少是可疑的。你正在改变第一个和第二个对象之间的程序吗? – Marco13

当您拨打gl.vertexAttribPointer时,缓冲区将被绑定到顶点属性。无论缓冲区绑定到gl.ARRAY_BUFFER那时您拨打gl.vertexAttribPointer现在都绑定到该属性。在上面创建一个新的缓冲区,但由于没有调用gl.vertexAttribPointer,您的属性仍然指向您之前附加的任何缓冲区。

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

+0

谢谢。那么,如果我想对另一个对象执行不同的转换呢? – foobar5512

+0

对您有帮助吗? http://*.com/a/20850791/128511 – gman