【发布时间】:2021-01-21 17:10:54
【问题描述】:
我目前正在为我的一个项目使用 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)
【问题讨论】:
-
宁可在官方 JogAmp 论坛上问这个问题,因为它可能非常特定于 JOGL。
-
发布一个SSCCE而不是一段代码。
-
嘿@gouessej :) 感谢您的回答。遗憾的是,我目前无法访问下周一必须发布的代码。我也会将它发布到 JogAmp 论坛。对于您在 Rabbid76 下的评论回答:您是对的,我确实为 DrawArrays 使用了错误的参数。不是必须是
vertbuf.limit()/3吗?还是我理解错了? ^^ 关于您发布的示例:我想我不能使用它,因为我不能在 WorldWind(我正在使用)中使用着色器。无论如何,感谢您总是回答我的问题并试图帮助我:D。 -
我在不使用着色器的 T.U.E.R 中做了类似的事情:svn.code.sf.net/p/tuer/code/alpha/drawer/… 但我没有使用 VAO,而是使用了交错的 VBO。使用 GL_C3F_V3F 作为交错格式,并将顶点之前的颜色放入您的直接 NIO 缓冲区中,调用
gl.glInterleavedArrays(GL2.GL_C3F_V3F,0 ,0);,不要忘记其余的,rewind(),... 然后,它是vertbuf.limit() / 6。 -
@gouessej 我在JogAmp Forum 上发布了我的问题我想我们可以继续在那里^^;。
标签: opengl-es jogl opengl-2.0