为什么还有很多波前 obj 文件在一张面上包含 4 个顶点?

Win*_*ces 1 opengl wavefront

今天,我开始实现波前 obj 加载器,问题是我不知道为什么互联网上有这么多包含 4 个顶点的 obj 文件,尽管事实上 OpenGL 不再支持 GL_QUADS 并弃用它。

有什么解决方法吗?我的意思是,每次我尝试使用 GL_TRIANGLE_FAN 或 GL_TRIANGLE_STRIP 绘制包含 4 个顶点的面时,它都会显示悲惨的结果。所以最后我别无选择,只能在每个面上发出绘制命令,正如你所知,它表现出糟糕的表现。我想绘制它只在每个组或平滑组上发出一个命令。

有任何想法吗?

Ret*_*adi 5

因为OBJ是一种与OpenGL完全无关的文件格式。

OBJ 文件中的人脸语句可以包含任意数量的顶点,不仅仅是 3 或 4 个。它们包含 4 个以上的顶点并不罕见。因此,如果您希望能够读取合理种类的 OBJ 文件,您需要准备读取每个面的任意数量的顶点。

这确实不会增加太多难度。除非您使用算法来分析连通性并构建网格,否则您会在每个面语句中获得一个单独的三角形,即使对于每个面只有 3 个顶点的文件也是如此。因此,在这种情况下,您可以为每个面创建一个三角形,并使用原始类型绘制它们GL_TRIANGLES

因此,每个面超过 3 个顶点的所有变化就是每个面生成多个三角形。n - 2对于带有n顶点的面,您将需要三角形。我对这个问题的回答更详细地解释了这是如何完成的:将 OBJ 文件中的四边形转换为三角形?.

另一种选择是将每个面视为三角形扇形,并使用GL_TRIANGLE_FAN基本类型渲染它们。凸多边形(如果文件中的面是非凸多边形,所有这些都会分解)始终可以绘制为三角形扇形,同时保持顶点完全按其原始顺序。要将每个面视为单独的三角形扇形,您可以使用自 OpenGL 3.1 以来可用的图元重启功能,使用如下调用:

glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(...);
Run Code Online (Sandbox Code Playgroud)

很容易看出 OBJ 不是针对 OpenGL 渲染的。更麻烦的方面是 OBJ 对位置、法线和纹理坐标使用单独的索引,而 OpenGL 仅支持一组用于所有顶点属性的索引。这往往会给编写解析器的人带来更多困难。参见此处的示例:OpenGL - 索引缓冲区困难