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.
This commit is contained in:
Clément Foucault
2023-09-27 23:01:02 +02:00
parent 8e188ed55b
commit 508fa8d4b8
4 changed files with 10 additions and 9 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);