diff options
| author | yum <yum.food.vr@gmail.com> | 2026-01-24 16:54:26 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2026-01-24 16:54:26 -0800 |
| commit | d0c27e80cefa593641f3525ef23e7fc5631b136b (patch) | |
| tree | 2894d04cac14f1403f49d52f8a742440cb8cfbf1 /filamented.cginc | |
| parent | 4885fb42bd42f5dfb7fdc198bd0cc42be7959aaf (diff) | |
Add anisotropic reflections
Diffstat (limited to 'filamented.cginc')
| -rw-r--r-- | filamented.cginc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/filamented.cginc b/filamented.cginc index b66baf2..ecf697f 100644 --- a/filamented.cginc +++ b/filamented.cginc @@ -889,6 +889,19 @@ float D_GGX(float roughness, float NoH, const float3 h) { return d; } +// t = tangent vector, b = bitangent vector +float D_GGX_Anisotropic(float at, float ab, float NoH, + const float3 h, + const float3 t, const float3 b) { + float ToH = dot(t, h); + float BoH = dot(b, h); + float a2 = at * ab; + float3 v = float3(ab * ToH, at * BoH, a2 * NoH); + float v2 = dot(v, v); + float w2 = a2 / v2; + return a2 * w2 * w2 * (1.0 / PI); +} + float F_Schlick(float f0, float VoH) { return f0 + (1.0 - f0) * pow5(1.0 - VoH); } @@ -935,6 +948,14 @@ float V_SmithGGXCorrelated_Fast(float roughness, float NoV, float NoL) { return v; } +float V_SmithGGXCorrelated_Anisotropic(float at, float ab, float ToV, float BoV, + float ToL, float BoL, float NoV, float NoL) { + float lambdaV = NoL * length(float3(at * ToV, ab * BoV, NoV)); + float lambdaL = NoV * length(float3(at * ToL, ab * BoL, NoL)); + float v = 0.5 / (lambdaV + lambdaL); + return saturate(v); +} + float perceptualRoughnessToRoughness(float perceptualRoughness) { return perceptualRoughness * perceptualRoughness; } |
