summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2026-03-29 17:22:49 -0700
committeryum <yum.food.vr@gmail.com>2026-03-29 17:22:49 -0700
commita7547f351228b1d0ab380096438b6664d925e07d (patch)
tree8c43598f3cd59176c27f20a712f54af680288a3d
parent4ed9ed040230f62a1144936df36afddf4a5208bb (diff)
Reframe glitter as a standalone lobe in the brdf
-rwxr-xr-xbrdf.cginc28
1 files changed, 17 insertions, 11 deletions
diff --git a/brdf.cginc b/brdf.cginc
index 8bd0061..fcc2594 100755
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -161,6 +161,23 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) {
remainder *= saturate(1.0f - bd.direct_f_cc * pbr.cc_strength);
#endif
+#if defined(_GLITTER)
+ float2 glitter_uv = i.uv01.xy;
+ float2x2 glitter_uv_J = uv_ellipsoid(mat2_from_cols(ddx(glitter_uv), ddy(glitter_uv)));
+ float3 H_tangent = mul(data.direct.H, transpose(pbr.tbn));
+ const float glitter_filter_size = 0.7f;
+ float glitter_N = 8.0e5f * pow(10.0f, _Glitter_Amount * 6.0f - 2.0f);
+ bd.direct_f = F_Schlick(data.direct.LoH, 0.96f, 1.0f);
+ bd.direct_d = D_Kemppinen(H_tangent, pbr.roughness, _Glitter_Roughness,
+ glitter_uv, glitter_uv_J, glitter_N, glitter_filter_size);
+ bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV);
+ float3 direct_specular_glitter = (bd.direct_d * bd.direct_g) * bd.direct_f;
+ direct_specular_glitter *= data.direct.color * data.direct.NoL;
+ direct_specular_glitter *= remainder;
+ specular += direct_specular_glitter;
+ remainder *= saturate(1.0f - direct_specular_glitter);
+#else
+
#if defined(_CLOTH)
float3 cloth_f0 = _Cloth_Sheen.rgb;
bd.direct_f = F_Schlick(data.direct.LoH, cloth_f0, f90);
@@ -180,17 +197,6 @@ float4 brdf(v2f i, Pbr pbr, LightData data, out BrdfData bd) {
#else
float3 direct_energy = energy_comp;
bd.direct_g = G_GGXSmith(pbr.roughness, data.direct.NoL, data.common.NoV);
-#if defined(_GLITTER)
- float2 glitter_uv = frac(i.uv01.xy);
- float2x2 glitter_uv_J = uv_ellipsoid(mat2_from_cols(ddx(glitter_uv), ddy(glitter_uv)));
- float3 H_tangent = mul(data.direct.H, transpose(pbr.tbn));
- const float glitter_filter_size = 0.7f;
- float glitter_N = 8.0e5f * pow(10.0f, _Glitter_Amount * 6.0f - 2.0f);
- bd.direct_f = F_Schlick(data.direct.LoH, 0.96f, 1.0f);
- bd.direct_d = D_Kemppinen(H_tangent, pbr.roughness, _Glitter_Roughness,
- glitter_uv, glitter_uv_J, glitter_N, glitter_filter_size);
- direct_energy = 1.0f;
-#else
bd.direct_f = F_Schlick(data.direct.LoH, f0_color, f90);
bd.direct_d = D_GGX(pbr.roughness, data.direct.NoH);
#endif