使用glDrawArrays绘制交错的VBO

3
我目前正在使用glDrawElements来使用多个VBO(顶点、颜色、纹理和索引)进行渲染。我发现很少有顶点是共享的,因此我想切换到glDrawArrays,并使用单个交错VBO。
我找不到一个清晰的例子来创建一个交错的VBO并添加一个四边形或三角形(顶点、颜色、纹理),以及使用glDrawArrays绘制所需的任何操作。这两个步骤的代码是什么?
1个回答

7

我的第一反应是:

//init
glBindBuffer(GL_ARRAY_BUFFER, new_array);
GLfloat data[] = { 
    0.f, 0.f, 0.f, 0.f, 0.f,
    0.f, 0.f, 100.f, 0.f, 1.f,
    0.f, 100.f, 100.f, 1.f, 1.f,
    0.f, 100.f, 100.f, 1.f, 1.f,
    0.f, 100.f, 0.f, 1.f, 0.f,
    0.f, 0.f, 0.f, 0.f, 0.f,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);

// draw
glBindBuffer(GL_ARRAY_BUFFER, new_array);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), NULL);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), ((char*)NULL)+3*sizeof(GLfloat) );
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

这段代码并不是特别神奇。请看以下几点:
  • data数组中加载数据:按原样,所有连续的数据
  • 将各种属性的步幅设置为5*sizeof(GLfloat),因为这正是数据中的内容:3个浮点数用于位置,2个浮点数用于纹理坐标。顺便说一下,通常情况下,您希望将这个值设置为2的幂次方,而不像这里。
  • 从数组开始处计算偏移量。因此,由于我们首先存储了顶点数据,因此顶点的偏移量为0。纹理坐标在3个位置浮点数后存储,因此其偏移量为3*sizeof(GLfloat)。

我没有在其中包含颜色的原因是:它们通常作为UNORMs存储,这使得初始化代码更加混乱。您需要在同一内存块中存储GLfloat和GLubyte。此时,如果您想在代码中执行此操作,则可以使用结构体,但这在很大程度上取决于最终数据的来源。


希望在发布后晚评论不会有问题 - 但是说“另外,你通常希望这是2的幂次方,不像这里。”的原因是什么? 如果您只使用位置和纹理坐标,那么在哪里填充额外数据使其成为2的幂次方?此外,您是指数据数组大小应为2的幂次方还是函数调用中的步长? - LintfordPickle
这个建议真正来自于人们尝试过并发现使用二的幂次方性能更好的过去经验。你不应该盲目接受这个建议,而是要验证它是否有所改进。归根结底,任何形式的缓存在内存和着色器之间都可能以二的幂次方工作。是的,如果需要,建议填充数据。此外,如果您的数据集具有任何严重内容,则通常具有许多属性,可以灵活选择使用哪种数据类型。开发人员明智地选择“适合”二的幂次方。 - Bahbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接