1

我正在 Optix 中进行热应用,我想导入一个 GLTF 文件,然后从每个基元开始光线。

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

提前感谢您的帮助!

4

1 回答 1

3

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

对于它的价值, glTF确实在 original.indices 中指定了逆时针旋转。但是,glTF 中的材质可以是双面的,并且Double Sided的规范表明,在查看表面的背面时,必须在评估光照之前翻转法线。

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

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

如果我所有的脸都是平的/不弯曲的,我是否应该能够使用其中任何一个而无需计算任何东西?

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

于 2020-03-09T18:45:49.737 回答