From 8b554c1896bbca618afbd25d5311a431f5165a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Wed, 23 Sep 2020 00:14:23 +0200 Subject: [PATCH] Correct the specular light contribution to be zero for fragments with a normal pointing away from the camera. --- .../engines/eevee/shaders/lights_lib.glsl | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl index 949e4d8f04f..17cb4b753a0 100644 --- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl @@ -367,36 +367,40 @@ float light_diffuse(LightData ld, vec3 N, vec3 V, vec4 l_vector) float light_specular(LightData ld, vec4 ltc_mat, vec3 N, vec3 V, vec4 l_vector) { - if (ld.l_type == AREA_RECT) { - vec3 corners[4]; - corners[0] = (l_vector.xyz + ld.l_right * -ld.l_sizex) + ld.l_up * ld.l_sizey; - corners[1] = (l_vector.xyz + ld.l_right * -ld.l_sizex) + ld.l_up * -ld.l_sizey; - corners[2] = (l_vector.xyz + ld.l_right * ld.l_sizex) + ld.l_up * -ld.l_sizey; - corners[3] = (l_vector.xyz + ld.l_right * ld.l_sizex) + ld.l_up * ld.l_sizey; + if (dot(N, V) > 0.0) { + if (ld.l_type == AREA_RECT) { + vec3 corners[4]; + corners[0] = (l_vector.xyz + ld.l_right * -ld.l_sizex) + ld.l_up * ld.l_sizey; + corners[1] = (l_vector.xyz + ld.l_right * -ld.l_sizex) + ld.l_up * -ld.l_sizey; + corners[2] = (l_vector.xyz + ld.l_right * ld.l_sizex) + ld.l_up * -ld.l_sizey; + corners[3] = (l_vector.xyz + ld.l_right * ld.l_sizex) + ld.l_up * ld.l_sizey; - ltc_transform_quad(N, V, ltc_matrix(ltc_mat), corners); + ltc_transform_quad(N, V, ltc_matrix(ltc_mat), corners); - return ltc_evaluate_quad(corners, vec3(0.0, 0.0, 1.0)); - } - else { - bool is_ellipse = (ld.l_type == AREA_ELLIPSE); - float radius_x = is_ellipse ? ld.l_sizex : ld.l_radius; - float radius_y = is_ellipse ? ld.l_sizey : ld.l_radius; + return ltc_evaluate_quad(corners, vec3(0.0, 0.0, 1.0)); + } + else { + bool is_ellipse = (ld.l_type == AREA_ELLIPSE); + float radius_x = is_ellipse ? ld.l_sizex : ld.l_radius; + float radius_y = is_ellipse ? ld.l_sizey : ld.l_radius; - vec3 L = (ld.l_type == SUN) ? -ld.l_forward : l_vector.xyz; - vec3 Px = ld.l_right; - vec3 Py = ld.l_up; + vec3 L = (ld.l_type == SUN) ? -ld.l_forward : l_vector.xyz; + vec3 Px = ld.l_right; + vec3 Py = ld.l_up; - if (ld.l_type == SPOT || ld.l_type == POINT) { - make_orthonormal_basis(l_vector.xyz / l_vector.w, Px, Py); - } + if (ld.l_type == SPOT || ld.l_type == POINT) { + make_orthonormal_basis(l_vector.xyz / l_vector.w, Px, Py); + } - vec3 points[3]; - points[0] = (L + Px * -radius_x) + Py * -radius_y; - points[1] = (L + Px * radius_x) + Py * -radius_y; - points[2] = (L + Px * radius_x) + Py * radius_y; + vec3 points[3]; + points[0] = (L + Px * -radius_x) + Py * -radius_y; + points[1] = (L + Px * radius_x) + Py * -radius_y; + points[2] = (L + Px * radius_x) + Py * radius_y; - return ltc_evaluate_disk(N, V, ltc_matrix(ltc_mat), points); + return ltc_evaluate_disk(N, V, ltc_matrix(ltc_mat), points); + } + } else { + return 0.0; } } -- 2.28.0.windows.1