diff options
| author | yum <yum.food.vr@gmail.com> | 2026-03-30 14:54:36 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-03-30 14:54:36 -0700 |
| commit | f009c086daa3f93de4a3d9ede315e6bc5f0e8d9b (patch) | |
| tree | 8c425b708f266f476a9a187826f7f9cd6357099b /lighting.cginc | |
| parent | a4697f5093479c3bc80ed29b2ebf45dc2794a40d (diff) | |
Glitter: move back to dominant direction for IBL
Diffstat (limited to 'lighting.cginc')
| -rwxr-xr-x | lighting.cginc | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/lighting.cginc b/lighting.cginc index 52c9cac..b6d3f8e 100755 --- a/lighting.cginc +++ b/lighting.cginc @@ -42,6 +42,15 @@ float3 getIndirectSpecular(v2f i, float perceptual_roughness, float3 view_dir, f return env_refl; } +float3 getAverageSHDirection(float3 L1r, float3 L1g, float3 L1b, float3 fallback_dir) { + float3 raw_dir = L1r + L1g + L1b; + float raw_dir_len = length(raw_dir); + if (abs(raw_dir_len) < 1e-3) { + return fallback_dir; + } + return raw_dir / raw_dir_len; +} + // Geomerics SH evaluation // https://community.arm.com/cfs-file/__key/telligent-evolution-components-attachments/01-2066-00-00-00-01-27-70/Simplifying_2D00_Spherical_2D00_Harmonics_2D00_for_2D00_Lighting.pdf float shEvaluateDiffuseL1Geomerics(float L0, float3 L1, float3 n) { @@ -139,22 +148,11 @@ float4 getIndirectDiffuse(v2f i, Pbr pbr, inout LightData light) { #endif #if defined(_SHADOWS) || defined(_SSFD) - float3x3 mat = float3x3( - light.indirect.L01r, - light.indirect.L01g, - light.indirect.L01b - ); - // Multiply unit vector by L1 matrix to get vector pointing in direction of - // light. - float3 raw_dir = mul(mat, float3(1,1,1)); - float raw_dir_len = length(raw_dir); - float3 dom_dir = normalize(mul(mat, float3(1,1,1))); - if (abs(raw_dir_len) < 1e-3) { - dom_dir = light.direct.dir; - } else { - dom_dir = raw_dir; - } - dom_dir = normalize(dom_dir); + float3 dom_dir = getAverageSHDirection( + light.indirect.L01r, + light.indirect.L01g, + light.indirect.L01b, + light.direct.dir); light.indirect.diffuse_dominant_dir = dom_dir; #endif @@ -266,11 +264,14 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.diffuse = getIndirectDiffuse(i, pbr, data); data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir, data.indirect.diffuse); #if defined(_GLITTER) + float3 glitter_indirect_dir = getAverageSHDirection( + data.indirect.L01r, + data.indirect.L01g, + data.indirect.L01b, + data.indirect.dir); data.glitter = GetGlitterLighting(_Glitter_Amount, _Glitter_Roughness, i.uv01.xy, pbr.tbn, pbr.roughness, - pbr.normal, data.common.V, data.direct.H, data.indirect.H); - data.glitter.indirect_specular = getIndirectSpecular(i, _Glitter_IBL_Roughness, - view_dir, data.glitter.indirect_dir, data.indirect.diffuse); + pbr.normal, data.common.V, data.direct.H, glitter_indirect_dir); #endif data.common.ao = getAO(i); @@ -299,9 +300,9 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.specular = HSVtoRGB(tmpHSV); #if defined(_GLITTER) - tmpHSV = RGBtoHSV(data.glitter.indirect_specular); + tmpHSV = RGBtoHSV(data.indirect.L00); tmpHSV[2] = clamp(tmpHSV[2], 0, _Brightness_Clamp_Max); - data.glitter.indirect_specular = HSVtoRGB(tmpHSV); + data.indirect.L00 = HSVtoRGB(tmpHSV); #endif #if defined(_CLEARCOAT) |
