使用灯光着色模型在 Metal 上生成黑色面(从半精度 NoV 传播的 NaN)
作者: mjsikorsky创建于 2026年8月9日更新于 2026年8月10日
1. surface_shading_parameters.fs — 根本原因修复:
强制将 NoV 点积转换为高精度 (float32),以防止半精度下溢:
highp vec3 hpNormal = shading_normal;
highp vec3 hpView = shading_view;
shading_NoV = clampNoV(dot(hpNormal, hpView));2. surface_material.fs — 防御性保护:
clampNoV 在 max() 前检查 NaN:
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:
float dfgY = max(pixel.dfg.y, MIN_N_DOT_V);
…内容来源: google/filament