【问题标题】:Combining vertex arrays with textures in OpenGL在OpenGL中将顶点数组与纹理相结合
【发布时间】:2011-09-02 15:10:39
【问题描述】:

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

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坐标数组读起来就像我在立即模式下填充它一样。

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

【问题讨论】:

  • 几天前我问了一个(远程)类似的问题:stackoverflow.com/questions/7232915/fewer-colors-than-vertices
  • 我在上面的代码中没有看到你的问题。顶点位置和纹理坐标可能共享索引,但您正在推进每​​个顶点的索引。顺便说一句,我认为您的调用顺序搞砸了:在设置了所有其他属性之后,您调用了 glVertex。在 glBegin...glEnd 块中,最后一个 OpenGL 命令应该是 glVertex

标签: opengl opengl-3


【解决方案1】:

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

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

【讨论】:

  • 谢谢你——其中一位“很高兴得到答案,但希望这是一个不同的答案”。然而这完全有道理——我只需要查看纹理文件以限制重复。
【解决方案2】:

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

【讨论】:

  • 感谢您的快速回答,但问题是网格中的单个顶点可以对应多个(例如 3 个)纹理坐标。将纹理排除在等式之外我们确实可以使用索引绘图,但是如果顶点 A 出现在 2 个面中,因此在我们对应于 2 (s,t) 对的纹理方案中,似乎没有办法使用索引绘图来实现这一点因为我们无法指定所需的多个 (s,t) 对。
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多