From 06492fd61984c1a92fb1f93d30028de97ead451f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 13 Feb 2021 18:49:42 +0100 Subject: EEVEE: Fix incorrect fresnel function. The optimized version was not correct. Also it is not showing any benefit over the non optimized version. --- .../engines/eevee/shaders/bsdf_common_lib.glsl | 24 ++++++++-------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'source/blender/draw/engines') diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index f050cf3a08a..cb4d8931af0 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -24,6 +24,7 @@ float ior_from_f0(float f0) return (-f - 1.0) / (f - 1.0); } +/* Simplified form of F_eta(eta, 1.0). */ float f0_from_ior(float eta) { float A = (eta - 1.0) / (eta + 1.0); @@ -56,30 +57,21 @@ float F_eta(float eta, float cos_theta) * the refracted direction */ float c = abs(cos_theta); float g = eta * eta - 1.0 + c * c; - float result; - if (g > 0.0) { g = sqrt(g); - vec2 g_c = vec2(g) + vec2(c, -c); - float A = g_c.y / g_c.x; - A *= A; - g_c *= c; - float B = (g_c.y - 1.0) / (g_c.x + 1.0); - B *= B; - result = 0.5 * A * (1.0 + B); - } - else { - result = 1.0; /* TIR (no refracted component) */ + float A = (g - c) / (g + c); + float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0); + return 0.5 * A * A * (1.0 + B * B); } - - return result; + /* Total internal reflections. */ + return 1.0; } /* Fresnel color blend base on fresnel factor */ vec3 F_color_blend(float eta, float fresnel, vec3 f0_color) { - float f0 = F_eta(eta, 1.0); - float fac = saturate((fresnel - f0) / max(1e-8, 1.0 - f0)); + float f0 = f0_from_ior(eta); + float fac = saturate((fresnel - f0) / (1.0 - f0)); return mix(f0_color, vec3(1.0), fac); } -- cgit v1.2.3