summaryrefslogtreecommitdiffstats
path: root/glitter.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'glitter.cginc')
-rw-r--r--glitter.cginc21
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
-