我正在使用OpenGL ES 1.1并致力于将Blender的OBJ导出转换为包含顶点数据的二进制文件。我实际上已经有了一个工作工具,但我正在努力改变一些事情,并遇到了一个问题。
即使使用平滑着色,似乎正确的法线(垂直于面平面)也可以实现面部的平面外观。启用平滑着色并使用正确的法线(仅通过在Blender中标记为锐利的边缘并应用边缘分割修改器),我可以获得平滑部分和锐边的效果。
我要去的地方带来两个问题。
在平滑着色和使用法线的观点下,OBJ文件中是否显示平滑或平面着色的“s 1”或“s off”线是否完全没必要?
在OpenGL中实际设置为平面着色时,是否完全忽略法线(或假设所有法线都垂直于面)?
答案 0 :(得分:9)
要使顶点看起来平滑,其法线必须是相邻面法线(或类似物)的平均值,但不垂直于面平面(除非您测量其所有相邻面的平均平面)
GL_FLAT表示,脸部的颜色不是在三角形上插值,而是从单个三角形角落(不知道哪个,第一个或最后一个)。此颜色来自顶点颜色或顶点光照,因此实际上您获得了每个面法线,但这不是面部方向所必需的,而是角点顶点的法线。
如果在OBJ文件中得到每个顶点法线,则不需要s部分。但您可以使用它们来计算顶点法线。 s部分是平滑组,并被解释为32位位域。因此实际上有32个不同的平滑组,每个面都可以是多个平面组的一部分。因此,“5”行之后的所有面都是平滑组1和3(第一和第三位设置)的一部分。当两个相邻面是同一平滑组的一部分时,它们之间的边缘是平滑的(顶点共享法线)。这样就可以重建每个顶点法线的必要性。
答案 1 :(得分:1)
当我使用每个顶点法线时,更改gl_flat和gl_smooth之间的模式似乎不会影响我的渲染。我能说的问题是每张脸只有一个法线。对于平滑着色,每个面应该有三个法线,每个顶点一个,它们应该都是不同的。例如,圆柱体的法线,如果投射在圆柱体内部,则应该全部在圆柱体的轴线处相交。如果模型具有平滑法线,则OBJ导出应按每个顶点法线导出。听起来你可能正在分配每个脸部法线。至于在OpenGL-ES中渲染,不使用平滑组,只使用法线。