1

我正在制作这个需要渲染彩色四边形的程序。我为此使用 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());    

我无法让偏移量和步幅正确,所以当我渲染时,我看到了这个奇怪的伪影。

4

2 回答 2

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

于 2013-06-08T14:08:38.610 回答
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-out-buffer 数据,这是未定义的行为,可能会导致各种奇怪的效果.

于 2013-06-08T14:09:23.597 回答