summaryrefslogtreecommitdiffstats
path: root/lighting.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-16 14:40:45 -0700
committeryum <yum.food.vr@gmail.com>2026-03-16 14:40:45 -0700
commit921990168c22f5cccb77c5b608063d77adeaeab8 (patch)
treedec31c279ae80c2b07afd68e2ccc7af136bc8fdf /lighting.cginc
parente641d53cc28ca8b77c237aef89f4968c8114b614 (diff)
Fix tessellation shadows, and potential lighting NaNs
Diffstat (limited to 'lighting.cginc')
-rwxr-xr-xlighting.cginc30
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);