【问题标题】:OpenGL DrawArrays with Color带颜色的 OpenGL DrawArrays
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嘿,谢谢你的回答:)你是对的,这是一个错误,我认为我在设置 BufferSubData 时是否做错了同样的事情?它不应该是vertBuf.limit(),而是vertBuf.limit()*4?当然,colorBuffer 也是如此。我相应地更改了我的代码,但这些点仍然是灰色的。我的glDrawArrays() 电话可能有问题吗?
  • @FieryToken 偏移量和大小必须以字节为单位指定。我已经扩展了答案。
  • 嗯,是的,我已经尝试过了,但它仍然是灰色的。 ://
  • @FieryToken Rabbid76 是对的。对了,你可以用我们官方的例子:jogamp.org/cgit/jogl-demos.git/tree/src/demos/es2/…看numBytes。也看一下 glDrawArrays 的文档:khronos.org/registry/OpenGL-Refpages/gl4/html/…你最后一个参数是错误的,你没有传递要渲染的索引数。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多