summaryrefslogtreecommitdiffstats
path: root/lighting.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-30 14:54:36 -0700
committeryum <yum.food.vr@gmail.com>2026-03-30 14:54:36 -0700
commitf009c086daa3f93de4a3d9ede315e6bc5f0e8d9b (patch)
tree8c425b708f266f476a9a187826f7f9cd6357099b /lighting.cginc
parenta4697f5093479c3bc80ed29b2ebf45dc2794a40d (diff)
Glitter: move back to dominant direction for IBL
Diffstat (limited to 'lighting.cginc')
-rwxr-xr-xlighting.cginc43
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)