2011-05-06 84 views
3

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

我一直无法找到一个清晰的例子,创建一个交错的VBO,并添加一个四元或三元(垂直,颜色,纹理),和2)做任何需要使用glDrawArrays绘制它。这两个步骤的代码是什么?

回答

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个texcoord浮标。方面说明,你通常希望这是一个2的力量,不像这里。
  • 偏移量是从数组开始算起的。所以由于我们先存储顶点,顶点的偏移量为0. texcoord在3个位置数据浮点之后存储,所以它的偏移量是3 * sizeof(GLfloat)。

我没有在其中包含颜色,原因是:它们通常存储为UNORM,这使得初始化代码更加复杂。您需要将GLfloat和GLubyte存储在同一个内存块中。在那个时候,如果你想用代码来实现它,结构可以提供帮助,但它主要取决于你的数据最终来自哪里。

+0

我希望可以在帖子发布后很晚才发表评论 - 但是说'边注意,你通常希望这是2的幂,不同于这里'。 如果您只使用位置和tex坐标,您会在哪里填写额外的数据以使其为2的幂次?另外,你的意思是数据数组的大小应该是2的幂数还是函数调用的跨度? – 2012-11-07 11:11:52

+0

这真的来自人们尝试使用过去的经验,并发现它与两个幂更好地执行。你不应该接受这个建议,并盲目运行它,而是确认它的改进。它的底部是内存和着色器之间的任何形式的缓存都可能在两个功率下工作。是的,如果需要,建议是填充数据。同样,如果你的数据集有任何严重的内容,你通常会有很多属性,并灵活使用哪种数据类型。开发人员明智地选择“适合”二选一 – Bahbar 2012-11-08 12:19:35