2011-05-07 54 views
5

我正在使用OpenGL ES 1.1,并将从Blender的OBJ导出转换为包含顶点数据的一些二进制文件。我其实已经有了一个工作工具,但我正在努力改变一些事情并且遇到一个问题。OBJ格式和平VS光滑底纹

即使使用平滑阴影,似乎使用正确的法线(垂直于脸部平面),它可以获得脸部的平整外观。启用平滑着色和正确的法线(只需通过在Blender中标记为尖锐的边缘和应用了边缘分割修改器),就可以获得平滑部分和锐利边缘的效果。

我要去哪里带来2个问题。

  1. 是“S 1”或“S关闭”,其中平滑的或平坦的阴影在OBJ文件从一个平滑阴影和使用法线的角度来看的完全不必要表示行?

  2. 当在OpenGL中实际设置为平面着色时,是否完全忽略了法线(或者只是假设所有都垂直于面)?

回答

9

要使顶点看起来平滑,其法线必须是相邻面法线的平均值(或类似的东西),但不垂直于面平面(除非您已将所有相邻面的平均面)。 GL_FLAT意味着,脸部的颜色不是在三角形内插的,而是从单个三角形角落(不知道是哪个,第一个还是最后一个)。这种颜色来自顶点颜色或顶点光照,所以实际上你可以得到每个面的法线,但这并不一定是面的方向,而是角顶点的法线。

如果您在OBJ文件中获得了每个顶点法线,则不需要s部分。但您可以使用这些来计算顶点法线。 s部分是平滑组,并被解释为32位位域。所以实际上有32个不同的平滑组,每个面都可以是多个平面组的一部分。因此,在“5”行之后的所有面都是平滑组1和3(设置的第一和第三位)的一部分。当两个相邻的面是同一平滑组的一部分时,它们之间的边是平滑的(顶点共享法线)。这样你就可以重建必要的每顶点法线。

+0

OBJ规范中没有任何内容说平滑组应该被解释为位掩码,但是以这种方式使用它们非常方便,所以我可以明白为什么游戏引擎可能会以这种方式对待它们。 – ideasman42 2013-08-26 21:14:18

+0

@ ideasman42嗯,也许我从3DS格式中得到了这个,因为它们肯定是以这种方式使用的。当把他们作为光滑的组ID时,你不能让一个脸部属于多个组。 – 2013-08-26 21:23:43

+1

不应该在5号线之后的所有面都是平滑组1和3的一部分,而是平滑组1和4。 – PinkTurtle 2016-02-09 13:53:21

1

更改gl_flat和gl_smooth之间的模式似乎不影响我使用每个顶点法线时的渲染效果。我可以告诉你的问题是每个人脸只有一个正常人。为了平滑着色,每张脸应该有三个法线,每个顶点一个,它们应该都是不同的。例如,圆柱体的法线如果投影到圆柱体内部,则应该全部相交于圆柱体的轴线。如果您的模型具有平滑法线,则应该按照顶点法线输出OBJ导出。这听起来像你可能分配每个脸部法线。就OpenGL-ES中的渲染而言,不使用平滑组,仅使用法线。