所以使用Wavefront object file我应该如何在OpenGL中渲染具有4个以上顶点的面?
我知道如果它有3个顶点我使用GL_TRIANGLES
,如果它有4个我使用GL_QUADS
,但如果它有5个或更多,我应该使用什么?有标准吗?
答案 0 :(得分:8)
首先,您应该告诉任何导出工具不要导出具有那么多顶点的面。面应该有3个顶点,句点。
如果导出工具无法做到这一点,那么加载工具应该将多边形分解为3个顶点面。我很确定the Asset Importer library可以做到这一点。
答案 1 :(得分:7)
OBJ导出器将按照每个面的合理顺序导出顶点(反/顺时针),只要你的面是共面和凸面(它们应该是血腥的!) - 你可以使用GL_TRIANGLE_FAN。
我不同意Nicol Bolas的观点,即面部应该总是有3个顶点,尽管是傻瓜式的,如果您的多边形遵循上述规则,使用GL_TRIANGLE_FAN
可以简化代码并减少系统内存消耗。没有什么会改变GPU方面,因为无论如何多边形将被分解为三角形。
答案 2 :(得分:4)
在实践中,大多数wavefront-obj面都是共面和凸面,但我在original OBJ specification中找不到任何可以保证这一点的内容。
如果脸部是共面和凸面,您可以使用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-gon中的顶点数量很大,使用GL_TRIANGLE_STRIP或手动形成自己的三角形条带,可以产生更好的视觉效果。但这在波前OBJ文件中非常罕见。
如果脸是共面的但是凹面,那么你需要使用算法对脸部进行三角测量,例如耳剪法。
http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method
如果顶点不是共面的,那么你就搞砸了,因为OBJ没有保留足够的信息来知道曲面细分的形状。