带有颜色的 OpenGL DrawArray

问题描述

我目前在我的一个项目中使用 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);

glBufferSubDataoffsetsize 参数还指定了缓冲区偏移量和缓冲区大小以字节为单位

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);