Opengl 用gldrawArray绘制交错VBO

Opengl 用gldrawArray绘制交错VBO,opengl,vbo,Opengl,Vbo,我目前正在使用GLDrawerElements使用多个VBO(顶点、颜色、纹理和索引)进行渲染。我发现很少有顶点是共享的,所以我想切换到GLDrawArray和单个交错VBO 我找不到一个清晰的例子,1)创建一个交错的VBO并向其中添加一个四元或三元(顶点、颜色、纹理),2)使用glDrawArrays做任何需要的事情来绘制它。这两个步骤的代码是什么 //init glBindBuffer(GL_ARRAY_BUFFER, new_array); GLfloat data[] = {

我目前正在使用GLDrawerElements使用多个VBO(顶点、颜色、纹理和索引)进行渲染。我发现很少有顶点是共享的,所以我想切换到GLDrawArray和单个交错VBO


我找不到一个清晰的例子,1)创建一个交错的VBO并向其中添加一个四元或三元(顶点、颜色、纹理),2)使用glDrawArrays做任何需要的事情来绘制它。这两个步骤的代码是什么

//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);
这段代码没有什么特别神奇的地方。只需看看如何:

  • 将加载
    数据
    数组中的数据:按原样加载所有连续数据
  • 各种属性的步幅设置为5*sizeof(GLfloat),因为这是数据中的内容:位置为3个浮点,texcoord为2个浮点。旁注,你通常希望它是2的幂,不像这里
  • 偏移量是从阵列的起点开始计算的。因为我们先存储顶点,所以顶点的偏移量是0。texcoord存储在位置数据的3个浮点之后,因此其偏移量为3*sizeof(GLfloat)

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

我希望在帖子发表后这么晚发表评论是可以的,但为什么要说“旁注,你通常希望它是2的幂,不像这里?”?如果您只使用positions和tex coords,您会在哪里填写额外的数据,使其成为2的幂?另外,您的意思是数据数组大小应该是2的幂还是函数调用中的步长?这实际上来自过去的经验,即人们尝试使用2的幂后发现它的性能更好。你不应该接受这个建议,盲目地使用它,而应该验证它是否有所改进。归根结底,内存和着色器之间的任何形式的缓存都可能以二次方的形式工作。是的,如果需要,建议填充数据。另外,如果您的数据集有任何重要的内容,您通常会有很多属性,并且可以灵活地选择使用哪种数据类型。开发人员明智地选择“适合”二次幂