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 /glitter.cginc | |
| parent | a4697f5093479c3bc80ed29b2ebf45dc2794a40d (diff) | |
Glitter: move back to dominant direction for IBL
Diffstat (limited to 'glitter.cginc')
| -rw-r--r-- | glitter.cginc | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/glitter.cginc b/glitter.cginc index 676b902..022b176 100644 --- a/glitter.cginc +++ b/glitter.cginc @@ -14,9 +14,7 @@ * 1. Syntax changes required to translate GLSL to HLSL. * 2. Stylistic preferences, like using "1" or "1.0" instead of "1.". * 3. The `GetGlitterLighting` function, which populates data required for - * IBL. The original paper only discusses analytic lighting. For IBL, you - * also need the micro-normal to figure out which part of the cubemap to - * sample. + * indirect glitter. The original paper only discusses analytic lighting. * * @article{KPT:2025:Glinty, * title = {Evaluating and Sampling Glinty NDFs in Constant Time}, @@ -171,6 +169,7 @@ float3 disk_to_ndf_ggx(float2 v_disk, float alpha) { return float3(alpha * hemi.xy, hemi.z) / denom; } +// Algorithm 1 from Kemppinen et. al. float D_Kemppinen(float3 h, float alpha, float glint_alpha, float2 uv, float2x2 uv_J, float N, float filter_size, out float3 micro_normal) { float res = sqrt(N); @@ -235,9 +234,6 @@ struct LightGlitter { float direct_D; float indirect_D; - float3 indirect_specular; - float3 indirect_dir; - float3 indirect_H; float indirect_NoL; float indirect_LoH; }; @@ -246,7 +242,7 @@ struct LightGlitter { LightGlitter GetGlitterLighting( float glitter_amount, float glitter_roughness, float2 uv, float3x3 tbn, float roughness, - float3 normal, float3 V, float3 direct_H, float3 indirect_H) { + float3 normal, float3 V, float3 direct_H, float3 indirect_dir) { LightGlitter g; const float glitter_filter_size = 0.7f; float2x2 uv_J = uv_ellipsoid(transpose(float2x2(ddx(uv), ddy(uv)))); @@ -259,19 +255,16 @@ LightGlitter GetGlitterLighting( uv, uv_J, N, glitter_filter_size, direct_micro_normal); // Indirect + float3 indirect_H = normalize(V + indirect_dir); float3 indirect_H_tangent = mul(indirect_H, transpose(tbn)); - float3 indirect_micro_normal; // used to sample cubemap + float3 indirect_micro_normal; // unused, but required by D_Kemppinen g.indirect_D = D_Kemppinen(indirect_H_tangent, roughness, glitter_roughness, uv, uv_J, N, glitter_filter_size, indirect_micro_normal); - // Normal vector is the halfway vector in IBL. - g.indirect_H = normalize(mul(indirect_micro_normal, tbn)); - g.indirect_dir = reflect(-V, g.indirect_H); - g.indirect_NoL = max(1e-4, dot(normal, g.indirect_dir)); - g.indirect_LoH = max(1e-4, dot(g.indirect_dir, g.indirect_H)); + g.indirect_NoL = max(1e-4, dot(normal, indirect_dir)); + g.indirect_LoH = max(1e-4, dot(indirect_dir, indirect_H)); return g; } #endif #endif // __GLITTER_INC - |
