#10280·filament

使用灯光着色模型在 Metal 上生成黑色面(从半精度 NoV 传播的 NaN)

作者: mjsikorsky创建于 2026年8月9日更新于 2026年8月10日

1. surface_shading_parameters.fs — 根本原因修复: 强制将 NoV 点积转换为高精度 (float32),以防止半精度下溢:

glsl
highp vec3 hpNormal = shading_normal;
highp vec3 hpView = shading_view;
shading_NoV = clampNoV(dot(hpNormal, hpView));

2. surface_material.fs — 防御性保护: clampNoVmax() 前检查 NaN:

glsl
NoV = (NoV != NoV) ? 0.0 : NoV;  // x != x 只对 NaN 为真
return max(NoV, MIN_N_DOT_V);

3. surface_shading_lit.fs — 防御性保护: 保护 1.0 / pixel.dfg.y 除法不为零/NaN:

glsl
float dfgY = max(pixel.dfg.y, MIN_N_DOT_V);
…

内容来源: google/filament