0

我目前正在为我的一个项目使用 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 的调用看起来如何,因此它实际上使用了颜色值。目前,当点被渲染时,它们只是灰色的,就好像我没有为它们分配颜色一样。我知道使用着色器会很容易,但我不能使用它们。我必须这样做。位置保存在一个名为的 FloatBuffervertBuf中,而颜色保存在一个名为 的 FloatBuffer 中colorBuffer。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)
4

1 回答 1

1

的最后一个参数是以字节glColorPointer为单位的缓冲区偏移量。所以偏移量而不是:vertBuf.limit() * 4vertBuf.limit()

gl.glColorPointer(3, GL2.GL_FLOAT, stride, vertBuf.limit());

gl.glColorPointer(3, GL2.GL_FLOAT, stride, vertBuf.limit()*4);

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

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);
于 2021-01-21T18:01:56.883 回答