在OpenGL中将顶点数组与纹理组合在一起

时间:2011-09-02 15:10:40

标签: opengl opengl-3

我正在尝试使用顶点数组来绘制一个包含大量顶点的相当大的网格。纹理已根据这些确定,并且很容易沿着以下方式立即绘制:

glBegin(GL_TRIANGLES) {
  for ( int faceIdx = 0; faceIdx < nFaces; ++faceIdx )
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);      
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);  
  }   
} 
glEnd();

然而,为了可读性,速度和其他我想使用顶点数组(以便转移到VBO)。有没有办法绕过多次将一个顶点放入数组?

据我所知,目前有必要指定网格的每个顶点多次出现在网格的一个面上,因为每个顶点都标识出多个纹理坐标(纹理是从现实世界中捕获的)网格近似的对象的图像,即我的vertex / tex coord数组读取就像我在立即模式下填充它一样。

有没有办法使用顶点数组,同时指定纹理坐标,而不使用冗余(我的意思是重复)顶点?

2 个答案:

答案 0 :(得分:5)

单个顶点由构成此单个顶点的所有属性组成。因此,共享相同位置但具有不同纹理坐标的两个顶点在概念上是不同的顶点。所以不,没有简单的方法可以为不同的texCoords重复顶点位置。

但通常这样的顶点重复只是在一些罕见的区域(如锋利的边缘,因为不同的法线,或在你的情况下像纹理接缝)是必要的。你的所有角落都有不同的texCoords吗?也许您可以稍微预处理数据并找到共享位置 texCoords的相邻面,因此可以共享顶点。如果对于许多顶点不是这种情况并且最终只有一小部分重复顶点,我会感到惊讶。

答案 1 :(得分:-1)

如果我理解你的问题是正确的,那么确实有办法摆脱不得不将相同的顶点多次放入顶点缓冲区。您可以使用索引缓冲区并使用索引来指定相同的顶点。这可以显着加快渲染速度。