6

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

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)。有没有办法绕过将单个顶点多次放入数组中?

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

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

4

2 回答 2

6

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

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

于 2011-09-02T15:59:57.277 回答
-1

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

于 2011-09-02T15:23:08.450 回答