从顶点获得朝外的法线

get outward facing normal from vertices

我正在 Optix 中开发热应用程序,我想导入一个 GLTF 文件,然后从每个图元开始光线。

我不完全理解 gltf 中存储的面孔重新分级 "front" 和 "back" 的文档。 是否有正确的方法来使用三角形的三个顶点并在边上使用叉积来计算向外的法线?如果我的代码按预期工作,我有时会得到一个内在的,有时是一个外在的法线。或者顶点的存储顺序是任意的,因此方向可能会反转? 如果我理解正确的话,每张脸也存储了 3 "normals"。如果我所有的脸都是 flat/not 弯曲的,我是否可以使用其中任何一个而无需计算任何东西?

提前感谢您的帮助!

在 glTF 中,法线是按顶点存储的。在大多数图形管道中,面的法线通常是在光栅化(硬件)期间计算的,作为该面的顶点法线之间的线性插值。

值得一提的是,glTF 确实在 primitive.indices. However, materials in glTF are allowed to be double-sided, and the specification for Double Sided 中指定了逆时针旋转,这表明在查看表面的背面时,必须在评估光照之前翻转法线。

实际上,有时创作工具会生成由内而外的多边形网格,甚至具有薄壁(非流形或非水密)几何体。在这种情况下,很难说 "inside" 和 "outside" 是什么,因为它们看起来一样,而且缠绕顺序可能是任意的。 (在 Blender 编辑模式下,点击菜单 Mesh -> Normals -> Recalculate Outside 来解决这个问题)。

对于单面 materials,缠绕顺序不应该是任意的,因为背面是隐藏的。当使用那些 material 时,人们会期望逆时针缠绕顺序三角形。在 Blender 中,这可以通过选择 "Eevee" 引擎,调出 material 属性面板,然后勾选 "Backface culling" 来完成。确保这发生在 material 设置中,而不是在视口设置中,否则 glTF 导出器将找不到它。使用 "Material Preview" 查看模式查看结果。

If all my faces are flat/not curved, should I be able to use any of these without even having to compute anything?

是的,如果你有完全平坦的面,我希望每个面内的顶点法线相等,这样线性插值不会对法向量产生任何变化。