微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有颜色的 OpenGL DrawArray

如何解决带有颜色的 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。