diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-16 14:40:45 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-16 14:40:45 -0700 |
| commit | 921990168c22f5cccb77c5b608063d77adeaeab8 (patch) | |
| tree | dec31c279ae80c2b07afd68e2ccc7af136bc8fdf /lighting.cginc | |
| parent | e641d53cc28ca8b77c237aef89f4968c8114b614 (diff) | |
Fix tessellation shadows, and potential lighting NaNs
Diffstat (limited to 'lighting.cginc')
| -rwxr-xr-x | lighting.cginc | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/lighting.cginc b/lighting.cginc index cde444a..c8c3f64 100755 --- a/lighting.cginc +++ b/lighting.cginc @@ -205,28 +205,28 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.common.V = -view_dir; data.common.N = pbr.normal; - data.common.NoV = saturate(dot(pbr.normal, data.common.V)); + data.common.NoV = max(1e-4, dot(pbr.normal, data.common.V)); #if defined(_CLEARCOAT) - data.common.NoV_cc = saturate(dot(pbr.cc_normal, data.common.V)); + data.common.NoV_cc = max(1e-4, dot(pbr.cc_normal, data.common.V)); #endif // Direct lighting data.direct.dir = getDirectLightDirection(i); data.direct.H = normalize(data.common.V + data.direct.dir); #if defined(_WRAPPED_LIGHTING) - data.direct.NoL = wrapNoL(saturate(dot(pbr.normal, data.direct.dir)), _Wrapped_Lighting_Amount); + data.direct.NoL = max(1e-4, wrapNoL(saturate(dot(pbr.normal, data.direct.dir)), _Wrapped_Lighting_Amount)); #else - data.direct.NoL = saturate(dot(pbr.normal, data.direct.dir)); + data.direct.NoL = max(1e-4, dot(pbr.normal, data.direct.dir)); #endif - data.direct.NoH = saturate(dot(pbr.normal, data.direct.H)); - data.direct.LoH = saturate(dot(data.direct.dir, data.direct.H)); + data.direct.NoH = max(1e-4, dot(pbr.normal, data.direct.H)); + data.direct.LoH = max(1e-4, dot(data.direct.dir, data.direct.H)); #if defined(_CLEARCOAT) - data.direct.NoH_cc = saturate(dot(pbr.cc_normal, data.direct.H)); - data.direct.NoL_cc = saturate(dot(pbr.cc_normal, data.direct.dir)); + data.direct.NoH_cc = max(1e-4, dot(pbr.cc_normal, data.direct.H)); + data.direct.NoL_cc = max(1e-4, dot(pbr.cc_normal, data.direct.dir)); #endif float direct_LoV = dot(data.direct.dir, data.common.V); - data.direct.LoV = saturate(direct_LoV); - data.direct.double_LoV = saturate(2.0f * direct_LoV * direct_LoV - 1.0f); + data.direct.LoV = max(1e-4, direct_LoV); + data.direct.double_LoV = max(1e-4, 2.0f * direct_LoV * direct_LoV - 1.0f); float4 lightColorIntensity = getDirectLightColorIntensity(); data.direct.color = lightColorIntensity.rgb * getShadowAttenuation(i); @@ -237,18 +237,18 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.dir = normalize(dominant_dir); data.indirect.H = normalize(data.common.V + data.indirect.dir); - data.indirect.NoL = saturate(dot(pbr.normal, data.indirect.dir)); - data.indirect.NoH = saturate(dot(pbr.normal, data.indirect.H)); + data.indirect.NoL = max(1e-4, dot(pbr.normal, data.indirect.dir)); + data.indirect.NoH = max(1e-4, dot(pbr.normal, data.indirect.H)); #if defined(_CLEARCOAT) float3 cc_reflect_dir = reflect(-data.common.V, pbr.cc_normal); float3 cc_dominant_dir = getSpecularDominantDirection(pbr.cc_normal, cc_reflect_dir, pbr.cc_roughness); float3 dir_cc = normalize(cc_dominant_dir); float3 H_cc = normalize(data.common.V + dir_cc); #endif - data.indirect.LoH = saturate(dot(data.indirect.dir, data.indirect.H)); + data.indirect.LoH = max(1e-4, dot(data.indirect.dir, data.indirect.H)); float indirect_LoV = dot(data.indirect.dir, data.common.V); - data.indirect.LoV = saturate(indirect_LoV); - data.indirect.double_LoV = saturate(2.0f * indirect_LoV * indirect_LoV - 1.0f); + data.indirect.LoV = max(1e-4, indirect_LoV); + data.indirect.double_LoV = max(1e-4, 2.0f * indirect_LoV * indirect_LoV - 1.0f); data.indirect.diffuse = getIndirectDiffuse(i, pbr, data); data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir, data.indirect.diffuse); |
