VBO - 没有索引的索引

时间:2012-12-20 22:00:12

标签: opengl indexing vbo

我正在尝试将带有Element Array Buffer的VBO用于我的三角形,如下所示:

 glBindBuffer(GL_ARRAY_BUFFER, g_Buffer[0]);    
 glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
 glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(Model->GetNbVertex()*3*sizeof(float)));

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_Buffer[1]);
 glDrawElements(GL_TRIANGLES, Model->GetNbTriangle()*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

但我想使用一些纹理坐标,但我的TextCoord 不是  “索引”

三角形有3个文本坐标。 我有N个顶点和M个三角形,所以我有3M文本坐标, 3N TextCoord。所以我不能使用glTexCoordPointer,因为他期望一个顶点只有一个文本坐标,而且不是我的情况。

我想保持顶点的索引不要破坏我的GPU内存。

有一种方法可以将三角形索引用于某些元素,例如顶点,而不是其他元素,例如我的文本坐标? (我正在使用GLSL)

2 个答案:

答案 0 :(得分:0)

  

所以我不能使用glTexCoordPointer,因为他期望一个顶点只有一个文本坐标......

每个纹理单元

... 。再激活两个TU并为每个T glTexCoordPointer()调用:

glVertexPointer( ... );
glNormalPointer( ... );

glActiveTexture( GL_TEXTURE0 + 0 );
glClientActiveTexture( GL_TEXTURE0 + 0 );
glBindTexture( ..., texture1 );
glTexCoordPointer( ..., FIRST_OFFSET );

glActiveTexture( GL_TEXTURE0 + 1 );
glClientActiveTexture( GL_TEXTURE0 + 1 );
glBindTexture( ..., texture2 );
glTexCoordPointer( ..., SECOND_OFFSET );

glActiveTexture( GL_TEXTURE0 + 2 );
glClientActiveTexture( GL_TEXTURE0 + 2 );
glBindTexture( ..., texture3 );
glTexCoordPointer( ..., THIRD_OFFSET );

glDrawElements( ... );

编辑:虽然为了获得最大的灵活性和向前兼容性,但只需对顶点位置和三个纹理坐标使用通用顶点属性。

答案 1 :(得分:0)

让我为您澄清以下内容

  

三角形有3个文本坐标。我有N个顶点和M个三角形,所以我有3M文本坐标,而不是3N TextCoord。

三角形有3个顶点。顶点是由几个属性组成的向量; 这是一个常见的错误观念,即顶点只是位置!顶点实际上是它所包含的所有属性的整体组合。如果两个顶点只有一个属性不同,那么它们就是不同的顶点。

在您的情况下,属性是

  • 位置
  • 纹理坐标

因此,当你说你有M个三角形时,这意味着你有3N个顶点 - 除了一些三角形共享顶点的角点情况,这意味着它们共享所有属性。

或换句话说:你总是拥有与顶点一样多的纹理坐标,因为纹理坐标是顶点的一部分。

更新

某些网格格式将顶点属性分隔为独立索引的属性列表,如位置,法线,纹理坐标。通常这些列表然后从面部索引。如果要绘制此类网格数据结构的内容,首先必须将其展开为单个索引的顶点列表。这样做的通常方法是迭代网格的所有面,并使用索引元组作为新替换索引列表的关键字。然后,对于遇到的每个键,将各种属性列表中的属性收集到由替换索引索引的单个顶点中。