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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user