我目前在我的一个项目中使用OpenGL2,我想渲染一个PointCloud。我也可以在正确的位置显示点,但我有一个颜色的问题。这是我的代码:
public void draw(DrawContext drawContext){
gl.glEnable(GL2.GL_DEPTH_BUFFER_BIT);
int stride = 0;
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, VBO.get(0));
gl.glVertexPointer(3, GL2.GL_FLOAT, stride, 0);
gl.glColorPointer(3, GL2.GL_FLOAT, stride,vertBuf.limit());
gl.glPointSize(4);
gl.glDrawArrays(GL_POINTS, 0, vertBuf.limit());
gl.glPointSize(1);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0);
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
gl.glDisable(GL2.GL_DEPTH_BUFFER_BIT);
}
位置和颜色值都在一个VBO中(我绑定的那个)。但我不知道对DrawArrays的调用应该是什么样子所以它实际上使用颜色值。目前,当点被渲染时,它们只是灰色的,就好像我没有给它们分配颜色一样。我知道这将很容易与着色器,但我不能使用他们。我必须这样做。位置保存在称为vertBuf
的FloatBuffer中,颜色保存在称为colorBuffer
的FloatBuffer中。colorValues也在0和1之间归一化,如果重要的话,是RGB的。
我像这样将位置和颜色值绑定到VBO:
gl.glBufferData(GL_ARRAY_BUFFER,(vertBuf.limit()*4)+(colorBuffer.limit()*4),null, GL_STATIC_DRAW)
gl.glBufferSubData(GL_ARRAY_BUFFER,0,vertBuf.limit(),vertBuf)
gl.glBufferSubData(GL_ARRAY_BUFFER,vertBuf.limit(),colorBuffer.limit(),colorBuffer)
glColorPointer
的最后一个参数是以字节为单位的缓冲区偏移量。所以偏移量是vertBuf.limit() * 4
而不是vertBuf.limit()
:
gl.glColorPointer(3, GL2.GL_FLOAT, stride, vertBuf.limit());
gl.glColorPointer(3, GL2.GL_FLOAT, stride, vertBuf.limit()*4);
glBufferSubData
的offset和size参数也指定了以字节为单位的缓冲区偏移量和缓冲区大小:
gl.glBufferSubData(GL_ARRAY_BUFFER,0,vertBuf.limit(),vertBuf)
gl.glBufferSubData(GL_ARRAY_BUFFER,vertBuf.limit(),colorBuffer.limit(),colorBuffer)
gl.glBufferSubData(GL_ARRAY_BUFFER, 0, vertBuf.limit()*4, vertBuf);
gl.glBufferSubData(GL_ARRAY_BUFFER, vertBuf.limit()*4, colorBuffer.limit()*4, colorBuffer);