用glDrawArrays绘制交错VBO



我目前使用glDrawElements来渲染使用多个vbo(顶点,颜色,纹理和索引)。我发现很少有顶点是共享的,所以我想切换到glDrawArrays,和一个单独的交错VBO。

我一直无法找到一个明确的例子,1)创建一个交错的VBO,并添加一个四边形或三边形(vert, color, texture),和2)做任何需要使用glDrawArrays来绘制它。这两个步骤的代码是什么?

Off the top of my head:

//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。texcoord存储在位置数据的3个浮点数之后,所以它的偏移量是3*sizeof(GLfloat)。

没有包含color是有原因的:它们通常存储为unorm,这会使初始化代码更混乱。您需要将GLfloat和GLubyte存储在同一个内存块中。在这一点上,如果您想在代码中做到这一点,结构体可以提供帮助,但这在很大程度上取决于您的数据最终来自何处。

最新更新