1

我正在尝试将 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 文本坐标。所以我不能使用 glTexCoordPointer 因为他期望一个顶点只有一个文本坐标,这不是我的情况。

我想保持我的顶点索引不会爆炸我的 GPU 内存。

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

4

2 回答 2

0

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

...每个纹理单元。再激活两个 TU 并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( ... );

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

于 2012-12-20T22:08:35.407 回答
0

让我为您澄清以下内容

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

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

在您的情况下,属性是

  • 位置
  • 纹理坐标

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

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

更新

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

于 2012-12-20T22:13:03.510 回答