我正在尝试将带有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)
答案 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个顶点 - 除了一些三角形共享顶点的角点情况,这意味着它们共享所有属性。
或换句话说:你总是拥有与顶点一样多的纹理坐标,因为纹理坐标是顶点的一部分。
某些网格格式将顶点属性分隔为独立索引的属性列表,如位置,法线,纹理坐标。通常这些列表然后从面部索引。如果要绘制此类网格数据结构的内容,首先必须将其展开为单个索引的顶点列表。这样做的通常方法是迭代网格的所有面,并使用索引元组作为新替换索引列表的关键字。然后,对于遇到的每个键,将各种属性列表中的属性收集到由替换索引索引的单个顶点中。