5

我正在使用 OpenGL ES 1.1 并致力于将 Blender 的 OBJ 导出转换为一些包含顶点数据的二进制文件。我实际上已经有了一个工作工具,但我正在努力改变一些事情并遇到了一个问题。

即使使用平滑着色,使用正确的法线(垂直于面平面)似乎也可以实现面的平坦外观。启用平滑着色和适当的法线(只需通过在 Blender 中标记为锐利的边缘并应用边缘分割修改器),我可以获得平滑部分和锐利边缘的影响。

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

  1. 从平滑着色和使用法线的角度来看,在 OBJ 文件中表示平滑或平坦着色的“s 1”或“s off”行是否完全不需要?

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

4

2 回答 2

9

为了使顶点看起来平滑,它的法线必须是相邻面法线(或类似的东西)的平均值,但不能垂直于面平面(除非您的意思是所有相邻面的平均平面)。

GL_FLAT 表示,面部的颜色不是在三角形上插值,而是取自单个三角形角(不知道哪个,第一个或最后一个)。这种颜色要么来自顶点颜色,要么来自顶点光照,所以实际上你得到的是每个面的法线,但这不一定是面的方向,而是角顶点的法线。

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

于 2011-05-09T19:48:14.130 回答
1

当我使用每个顶点法线时,更改 gl_flat 和 gl_smooth 之间的模式似乎不会影响我的渲染。据我所知,您的问题是每张脸只有一个正常值。对于平滑着色,每个面应该有三个法线,每个顶点一个,并且它们都应该是不同的。例如,圆柱体的法线如果投影在圆柱体内,则应全部与圆柱体的轴线相交。如果您的模型具有平滑法线,则 OBJ 导出应导出每个顶点法线。听起来您可能正在分配每个面部法线。至于在 OpenGL-ES 中的渲染,不使用平滑组,只使用法线。

于 2011-05-09T16:17:10.497 回答