java - OpenGL Interleaved VBO 跨步和偏移

标签 java opengl vbo

我正在制作这个需要渲染彩色四边形的程序。 为此,我正在使用 VBO。

这就是我存储顶点和颜色数据的方式:

渲染四边形:

 buff.put(3 floats color)
 render the quad (3 floats per vertex * 4 per face * 6 per quad) 

现在如您所见,我的目标是使用交错的 VBO,但我不知道步幅和偏移量。

这是我在渲染时的调用:

(注意我使用的是映射的 vbos,这就是没有实际数据绑定(bind)的原因):

        glBindBufferARB(GL_ARRAY_BUFFER_ARB, etn.getVboHandel());
        glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB);

        glColorPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0); 
        glVertexPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0);

        glDrawArrays(GL_QUADS, 0,  etn.getVboData().capacity());    

我无法获得正确的偏移量和步幅,所以当我渲染时我看到了这个奇怪的人工制品..

最佳答案

步幅是两个元组之间的距离,偏移量是从 0 到第一个元组的第一次出现之间的距离

例如,对于每个位置有 3 个 float 的三角形,然后正常有 3 个 float 的三角形,它看起来像这样

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);

所以你的顶点指针的偏移量为 0(假设前三个条目是位置)和步幅为 24(假设你的顶点颜色直接在顶点位置之后)

对于颜色指针,偏移量将是 (GLvoid*) (sizeof(float)*3) 作为第一个颜色三元组之前的三个 GLfloats

这一切都假设你的交错数组是这样构建的

VVVCCCVVVCCCVVVCCC 等等

对于使用仅具有顶点和法线信息以及面的模型的 C++ 中非常简单的示例,您可以查看以下代码:http://www.incentivelabs.de/Sourcecode/OpenGL10.zip

关于java - OpenGL Interleaved VBO 跨步和偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000110/

相关文章:

java - 当我添加 JComponent 时,java 图形中的绘图函数是否被多次调用?

Java如何遍历map对象

python - 创建一个修剪立方体 Pyglet 的平面

c++ - QPainterPaths 的高效离屏渲染(需要 OpenGL 和非 OpenGL 解决方案)

c++ - GL Buffer 设置为 GL_STATIC_DRAW 但需要发送每一帧

iphone - 在 2d 游戏中使用 OpenGL 最有效的方法是什么?

java - VBO 性能和 block

java - Java 选项 -Xmx 代表什么?

java - 如何在具有不同语言环境的java中将格式化字符串转换为 float ?

c++ - OpenGL GLM矩阵/vector 未正确初始化