问题描述
我目前在我的一个项目中使用 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,vertBuf.limit());
gl.glPointSize(4);
gl.glDrawArrays(GL_POINTS,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 中。颜色值也在 0 和 1 之间进行了标准化,并且如果重要的话,采用 RGB 格式。
我像这样将位置和颜色值绑定到 VBO:
gl.glBufferData(GL_ARRAY_BUFFER,(vertBuf.limit()*4)+(colorBuffer.limit()*4),null,GL_STATIC_DRAW)
gl.glBufferSubData(GL_ARRAY_BUFFER,vertBuf.limit(),vertBuf)
gl.glBufferSubData(GL_ARRAY_BUFFER,colorBuffer.limit(),colorBuffer)
解决方法
glColorPointer
的最后一个参数是缓冲区偏移量以字节为单位。所以偏移量 vertBuf.limit() * 4
而不是 vertBuf.limit()
:
gl.glColorPointer(3,GL2.GL_FLOAT,stride,vertBuf.limit());
gl.glColorPointer(3,vertBuf.limit()*4);
glBufferSubData
的 offset 和 size 参数还指定了缓冲区偏移量和缓冲区大小以字节为单位:
gl.glBufferSubData(GL_ARRAY_BUFFER,vertBuf.limit(),vertBuf)
gl.glBufferSubData(GL_ARRAY_BUFFER,colorBuffer.limit(),colorBuffer)
gl.glBufferSubData(GL_ARRAY_BUFFER,vertBuf.limit()*4,vertBuf);
gl.glBufferSubData(GL_ARRAY_BUFFER,colorBuffer.limit()*4,colorBuffer);