From 508fa8d4b8acae7f245589b54c8dffe4a7c69dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cle=CC=81ment=20Foucault?= Date: Wed, 27 Sep 2023 23:01:02 +0200 Subject: [PATCH] Fix #112963: EEVEE: Wrong specular from lights This was caused by the wrong LUT being sampled. This cleans-up the utilTex layer define usage and implement the small optimization marked as todo. --- source/blender/draw/engines/eevee/eevee_materials.cc | 10 +++++++--- .../engines/eevee/shaders/closure_eval_glossy_lib.glsl | 5 +---- .../draw/engines/eevee/shaders/common_utiltex_lib.glsl | 2 +- source/blender/draw/engines/eevee/shaders/ltc_lib.glsl | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_materials.cc b/source/blender/draw/engines/eevee/eevee_materials.cc index befa86bd1cb..1c19deb0b9d 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.cc +++ b/source/blender/draw/engines/eevee/eevee_materials.cc @@ -180,10 +180,14 @@ static void eevee_init_util_texture() * Copy ltc_mag_ggx into blue and alpha channel. */ for (int x = 0; x < 64; x++) { for (int y = 0; y < 64; y++) { + float ltc_sum = blender::eevee::lut::ltc_mag_ggx[y][x][0] + + blender::eevee::lut::ltc_mag_ggx[y][x][1]; + float brdf_sum = blender::eevee::lut::brdf_ggx[y][x][0] + + blender::eevee::lut::brdf_ggx[y][x][1]; texels_layer[y * 64 + x][0] = blender::eevee::lut::ltc_disk_integral[y][x][0]; - texels_layer[y * 64 + x][1] = 0.0; /* UNUSED */ - texels_layer[y * 64 + x][2] = blender::eevee::lut::ltc_mag_ggx[y][x][0]; - texels_layer[y * 64 + x][3] = blender::eevee::lut::ltc_mag_ggx[y][x][1]; + texels_layer[y * 64 + x][1] = ltc_sum / brdf_sum; + texels_layer[y * 64 + x][2] = 0.0f; /* UNUSED */ + texels_layer[y * 64 + x][3] = 0.0f; /* UNUSED */ } } texels_layer += 64 * 64; diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl index 048205343f7..b03d25b10e3 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl @@ -78,10 +78,7 @@ ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in, /* The BRDF split sum LUT is applied after the radiance accumulation. * Correct the LTC so that its energy is constant. */ - /* TODO(@fclem): Optimize this so that only one scale factor is stored. */ - vec4 ltc_brdf = texture(utilTex, vec3(lut_uv, LTC_BRDF_LAYER)).barg; - vec2 split_sum_brdf = ltc_brdf.zw; - cl_eval.ltc_brdf_scale = (ltc_brdf.x + ltc_brdf.y) / (split_sum_brdf.x + split_sum_brdf.y); + cl_eval.ltc_brdf_scale = texture(utilTex, vec3(lut_uv, LTC_BRDF_LAYER)).g; return cl_eval; } diff --git a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl index 3f110c1bfc2..7f7e559ed1a 100644 --- a/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/common_utiltex_lib.glsl @@ -21,9 +21,9 @@ uniform sampler2DArray utilTex; #define LTC_MAT_LAYER 0 #define LTC_BRDF_LAYER 3 +#define LTC_DISK_LAYER 3 #define BRDF_LUT_LAYER 1 #define NOISE_LAYER 2 -#define LTC_DISK_LAYER 3 /* UNUSED */ /* Layers 4 to 20 are for BTDF LUT. */ #define lut_btdf_layer_first 4.0 diff --git a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl index 2e57a3e4d38..bfbb2666d07 100644 --- a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl @@ -23,7 +23,7 @@ float diffuse_sphere_integral(float avg_dir_z, float form_factor) vec2 uv = vec2(avg_dir_z * 0.5 + 0.5, form_factor); uv = uv * (LUT_SIZE - 1.0) / LUT_SIZE + 0.5 / LUT_SIZE; - return texture(utilTex, vec3(uv, 3.0)).x; + return texture(utilTex, vec3(uv, LTC_DISK_LAYER)).x; #else /* Cheap approximation. Less smooth and have energy issues. */ return max((form_factor * form_factor + avg_dir_z) / (form_factor + 1.0), 0.0);