那么使用Wavefront 对象文件我应该如何在 OpenGL 中渲染具有超过 4 个顶点的面?
我知道如果它有 3 个我使用的顶点GL_TRIANGLES
,如果它有 4 个我使用GL_QUADS
,但如果它有 5 个或更多,我应该使用什么?有标准吗?
那么使用Wavefront 对象文件我应该如何在 OpenGL 中渲染具有超过 4 个顶点的面?
我知道如果它有 3 个我使用的顶点GL_TRIANGLES
,如果它有 4 个我使用GL_QUADS
,但如果它有 5 个或更多,我应该使用什么?有标准吗?
首先,您应该告诉任何导出工具不要导出具有那么多顶点的面。面应该有 3 个顶点,句号。
如果您的导出工具不能这样做,那么您的加载工具应该将多边形分解为 3 个顶点面。我相当肯定Asset Importer 库可以做到这一点。
OBJ 导出器将以合理的顺序导出每个面的顶点(逆时针/顺时针),只要你的面是共面的和凸的(它们应该是这样的!) - 你可以使用 GL_TRIANGLE_FAN。
我不同意 Nicol Bolas 的观点,即面应该始终有 3 个顶点,尽管万无一失,但如果您的多边形遵循上述规则,则使用可以GL_TRIANGLE_FAN
简化您的代码并减少系统内存消耗。什么都不会改变 GPU 方面,因为多边形无论如何都会被分解为三角形。
在实践中,大多数波前对象面是共面的和凸面的,但我在原始 OBJ 规范中找不到任何东西说这是有保证的。
如果面是共面和凸面,您可以使用 GL_TRIANGLE_FAN,也可以使用 GL_TRIANGLE 并自己手动评估扇形。扇形让所有三角形共享第一个顶点。像这样:
// manually generate a triangle-fan
for (int x = 1; x < (faceIndicies.Length-1); x++) {
renderIndicies.Add(faceIndicies[0]);
renderIndicies.Add(faceIndicies[x]);
renderIndicies.Add(faceIndicies[x+1]);
}
如果 n 边形中的顶点数量很大,使用 GL_TRIANGLE_STRIP 或手动形成自己的三角形条带,可以产生更好的视觉效果。但这在波前 OBJ 文件中非常少见。
如果面部是共面但凹的,那么您需要使用算法对面部进行三角测量,例如剪耳法。
http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method
如果顶点不共面,那你就完蛋了,因为 OBJ 没有保留足够的信息来了解镶嵌的形状。