From 3db43b67055ae2957e58dfde2ccdbb52c1226d65 Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Wed, 9 Oct 2024 12:40:33 +0200 Subject: [PATCH] Cleanup: EEVEE: remove unused code block and simplify computations --- .../shaders/eevee_bxdf_microfacet_lib.glsl | 55 +++++-------------- 1 file changed, 14 insertions(+), 41 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_microfacet_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_microfacet_lib.glsl index c82167093a7..ac64815bb3f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_microfacet_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_bxdf_microfacet_lib.glsl @@ -174,23 +174,17 @@ BsdfEval bxdf_ggx_eval(vec3 N, vec3 L, vec3 V, float alpha, float eta, const boo } vec3 H = do_reflection ? L + V : eta * L + V; + /* Ensure `H` is on the same hemisphere as `V`. */ H = (do_reflection || eta < 1.0) ? H : -H; float inv_len_H = safe_rcp(length(H)); H *= inv_len_H; - float NH = max(dot(N, H), 1e-8); - float VH = saturate(dot(V, H)); - float LH = saturate(dot(do_reflection ? L : -L, H)); - float a2 = square(alpha); float G_V = bxdf_ggx_smith_G1(NV, a2); float G_L = bxdf_ggx_smith_G1(NL, a2); + float NH = max(dot(N, H), 1e-8); float D = bxdf_ggx_D(NH, a2); - mat3 tangent_to_world = from_up_axis(N); - vec3 Vt = V * tangent_to_world; - vec3 Lt = L * tangent_to_world; - BsdfEval eval; if (do_reflection) { /** @@ -199,48 +193,27 @@ BsdfEval bxdf_ggx_eval(vec3 N, vec3 L, vec3 V, float alpha, float eta, const boo * https://gpuopen.com/download/publications/Bounded_VNDF_Sampling_for_Smith-GGX_Reflections.pdf * Listing 2. */ - float s2 = square(1.0 + length(Vt.xy)); - float len_ai_sqr = length_squared(alpha * Vt.xy); - float t = sqrt(len_ai_sqr + square(Vt.z)); - if (Vt.z >= 0.0) { - float k = (1.0 - a2) * s2 / (s2 + a2 * square(Vt.z)); - eval.pdf = D / (2.0 * (k * Vt.z + t)); + float NV2 = square(NV); + float s2 = square(1.0 + sqrt(1.0 - NV2)); + float len_ai_sqr = a2 * (1.0 - NV2); + float t = sqrt(len_ai_sqr + NV2); + if (NV >= 0.0) { + float k = (1.0 - a2) * s2 / (s2 + a2 * NV2); + eval.pdf = D / (2.0 * (k * NV + t)); } else { - eval.pdf = D * (t - Vt.z) / (2.0 * len_ai_sqr); + eval.pdf = D * (t - NV) / (2.0 * len_ai_sqr); } -#if 0 /* Should work without going into tangent space. But is currently wrong. */ - float sin_theta = sqrt(1.0 - square(NV)); - if (VH >= 0.0) { - float Vh_norm = length(vec2(sin_theta, NV)); - float s2 = square(1.0 + sin_theta); - float k = (1.0 - a2) * s2 / (s2 + a2 * square(NV)); - eval.pdf = D / (2.0 * (k * VH + Vh_norm)); - } - else { - float len_Vt_alpha_sqr = square(alpha * sin_theta); - float t = sqrt(len_Vt_alpha_sqr + square(VH)); - eval.pdf = D * (t - VH) / (2.0 * len_Vt_alpha_sqr); - } -#endif /* TODO: But also unused for now. */ eval.throughput = 1.0; } else { - vec3 Vh = normalize(vec3(alpha * Vt.xy, Vt.z)); - float G1_V = 2.0 * Vh.z / (1.0 + Vh.z); + float VH = saturate(dot(V, H)); + float LH = saturate(dot(-L, H)); - float Ht2 = square(-eta * LH + VH); - - eval.pdf = (D * G1_V * abs(VH * LH) * square(eta)) / (NV * Ht2); - -#if 0 /* Should work without going into tangent space. But is currently wrong. */ - float Ht2 = square(eta * LH + VH); - eval.pdf = D * G_V * abs(VH * LH) * square(eta) / (NV * Ht2); -#endif - /* `btdf * NL = abs(VH * LH) * ior^2 * D * G(V) * G(L) / (Ht2 * NV * NL) * NL`. */ - eval.throughput = (D * G_V * G_L * VH * LH * square(eta * inv_len_H)) / NV; + eval.pdf = (D * G_V * VH * LH * square(eta * inv_len_H)) / NV; + eval.throughput = eval.pdf * G_L; } return eval; }