在波前对象文件(.obj)中我应该如何在opengl中渲染具有4个以上顶点的面?

时间:2012-02-05 05:40:53

标签: c++ opengl polygon wavefront

所以使用Wavefront object file我应该如何在OpenGL中渲染具有4个以上顶点的面?

我知道如果它有3个顶点我使用GL_TRIANGLES,如果它有4个我使用GL_QUADS,但如果它有5个或更多,我应该使用什么?有标准吗?

3 个答案:

答案 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没有保留足够的信息来知道曲面细分的形状。