diff options
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; } |
