索引的UV映射问题

我正在尝试使用此代码将UV坐标映射到索引顶点。 我正在使用顶点缓冲区,纹理缓冲区和索引缓冲区(请注意,顶点和纹理缓冲区按照相同的顺序进行索引)

glBindTexture(GL_TEXTURE_2D, staticTexture); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, textureBuffer); glTexCoordPointer(2, GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, staticVertexBuffer); glVertexPointer(3, GL_FLOAT, 0, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glDrawElements(GL_QUADS, indices.size(), GL_UNSIGNED_INT, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glBindTexture(GL_TEXTURE_2D, 0); 

但是当我运行代码时,我得到了这个(相比于应该出现在每个面上的实际图像)

我的代码设置索引和uv坐标(立方体的一个面)

 uv.push_back(Vector2(0, 1)); uv.push_back(Vector2(1, 1)); uv.push_back(Vector2(1, 0)); uv.push_back(Vector2(0, 0)); indices.push_back(vertexIndexFromCoordinates(x, y, z)); indices.push_back(vertexIndexFromCoordinates(x, y, z + 1)); indices.push_back(vertexIndexFromCoordinates(x, y + 1, z + 1)); indices.push_back(vertexIndexFromCoordinates(x, y + 1, z)); 

运行uv映射

我唯一能想到的就是UV的顶点而不是索引。

是的,你的UV被映射到顶点,而不是索引 – 这是顶点缓冲区工作的方式。

您的顶点不仅仅是位置 – 也是颜色,法线,纹理坐标以及您附加的任何其他属性。

在像这样的情况下,实际上每个面都需要一个单独的副本,因为它们不共享纹理坐标。