繁体   English   中英

在OpenGL中将顶点阵列与纹理结合

[英]Combining vertex arrays with textures in OpenGL

我正在尝试使用顶点数组绘制一个相当大的网格,其中包含大量的顶点。 材质是从这些材质中确定的,很容易按照以下方式在即时模式下绘制:

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坐标数组的读取方式就像在即时模式下填充它一样。

有什么方法可以在指定纹理坐标的同时使用顶点数组,而不使用冗余(我的意思是重复)顶点?

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

但是通常,仅在某些罕见区域(例如,由于不同的法线而导致的锋利边缘,或者像是您的情况中的纹理接缝)才需要进行这种顶点复制。 那么,您所有面孔的角部确实具有不同的texCoords吗? 也许您可以对数据进行一些预处理,然后找到共享位置 texCoords并因此可以共享顶点的相邻面。 如果许多顶点不是这种情况,那我会感到惊讶,而您最终只会得到一小部分重复的顶点。

如果我正确理解了您的问题,那么确实有一种摆脱方法,不必将相同的顶点多次放入顶点缓冲区。 您可以使用索引缓冲区并使用索引来指定相同的顶点。 这样可以大大加快渲染速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM