OpenGL Interleaved VBO跨越和偏移

时间:2013-06-08 13:44:32

标签: java opengl vbo

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

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

渲染四元组:

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

现在你看到我的目标是使用交错的VBO,但我无法弄清楚步幅和偏移。

以下是渲染时的调用:

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

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

我无法获得偏移并且步幅正确所以当我渲染时我会看到这些奇怪的文物..

2 个答案:

答案 0 :(得分:3)

步幅是两个元组之间有多少空间,偏移量是0和第一个元组的第一次出现之间的空间大小

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

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

答案 1 :(得分:3)

您的描述并不十分一致:每个顶点3个浮点数不足以描述3D位置和RGB颜色。你的代码表明你实际上每个顶点有6个值,所以缓冲区可能看起来像

    +0    +4    +8    +12   +16   +20
 0: pos.x pos.y pos.z col.r col.g col.b
24: pos.x pos.y pos.z col.r col.g col.b
...

步幅是同一属性的两个连续值的“距离”,所以在这种情况下,它是 - 正确设置 - 6 *的sizeof(GLfloat)。偏移量是属性相对于缓冲区起始点的字节偏移量。在我的例子中,pos为0,col为3 * sizeof(GLfloat)。您将两者设置为相同的偏移量,因此您对不同的属性使用相同的数据,这很少是一个好主意。

此外,您的缓冲区设置似乎不清楚。这条线

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

表明etn.getVboData().capacity()是缓冲区中顶点的数量。如果是的话,

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

显然是错误的,因为每个顶点需要6 * sizeof(GLfloat)字节,因此您只复制部分数据,并且您正在访问out-ouf-buffer数据,这是未定义的行为并且可能导致各种类型奇怪的效果。