【问题标题】:OBJ format and Flat vs Smooth ShadingOBJ 格式和平面与平滑阴影
【发布时间】:2011-08-20 20:26:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: opengl-es blender


    【解决方案1】:

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

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

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

    【讨论】:

    • OBJ 规范中没有规定平滑组应被解释为位掩码,但以这种方式使用它们非常方便,所以我可以理解为什么游戏引擎会这样对待它们。跨度>
    • @ideasman42 嗯,也许我是从 3DS 格式得到的,因为它们肯定是这样使用的。仅将它们作为平滑组 ID 时,您无法让一张脸属于多个组。
    • 不应该是all faces after an "s 5" line are part of smoothing groups 1 and 3[...] smoothing groups 1 and 4 吗?
    • @PinkTurtle 不,第 1 位和第 3 位已设置,5 = 2^0 + 2^2
    • = 1 + 4,我的意思是:smoothing groups 1 and 4 因为你不能拥有 2 个平滑组的非幂 - 我们如何误解? :) IE。第 7 位设置为2^7 = 128,即平滑组 128 (s 128)。这不正确吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2019-08-26
      • 1970-01-01
      • 2018-06-20
      • 2017-12-12
      相关资源
      最近更新 更多