@@ -82,6 +82,7 @@ layout(set = 1, binding = 4) uniform DenoiseParams {
8282
8383 int half_search_window;
8484 float filter_strength;
85+ uint slice_count;
8586}
8687denoise_params;
8788#endif
@@ -1193,13 +1194,9 @@ void main() {
11931194 const float FILTER_SQUARE_TWO_SIGMA_LIGHT_SQUARE = FILTER_VALUE * FILTER_VALUE * TWO_SIGMA_LIGHT_SQUARE;
11941195 const float EPSILON = 1e- 6f;
11951196
1196- #ifdef USE_SH_LIGHTMAPS
1197- const uint slice_count = 4 ;
1197+ const uint slice_count = denoise_params.slice_count;
11981198 const uint slice_base = params.atlas_slice * slice_count;
1199- #else
1200- const uint slice_count = 1 ;
1201- const uint slice_base = params.atlas_slice;
1202- #endif
1199+ const bool is_directional = (slice_count == 4 );
12031200
12041201 for (uint i = 0 ; i < slice_count; i++ ) {
12051202 uint lightmap_slice = slice_base + i;
@@ -1223,9 +1220,16 @@ void main() {
12231220 for (int offset_x = - HALF_PATCH_WINDOW; offset_x <= HALF_PATCH_WINDOW; offset_x++ ) {
12241221 ivec2 offset_input_pos = atlas_pos + ivec2 (offset_x, offset_y);
12251222 ivec2 offset_search_pos = search_pos + ivec2 (offset_x, offset_y);
1226- vec3 offset_input_rgb = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (offset_input_pos, lightmap_slice ), 0 ).rgb;
1227- vec3 offset_search_rgb = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (offset_search_pos, lightmap_slice ), 0 ).rgb;
1223+ vec3 offset_input_rgb = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (offset_input_pos, slice_base ), 0 ).rgb;
1224+ vec3 offset_search_rgb = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (offset_search_pos, slice_base ), 0 ).rgb;
12281225 vec3 offset_delta_rgb = offset_input_rgb - offset_search_rgb;
1226+
1227+ if (is_directional) {
1228+ // Since L0 data is 1/4 the value of a regular lightmap,
1229+ // we have to multiply it by 4.
1230+ offset_delta_rgb *= 4.0 ;
1231+ }
1232+
12291233 patch_square_dist += dot (offset_delta_rgb, offset_delta_rgb) - TWO_SIGMA_LIGHT_SQUARE;
12301234 }
12311235 }
@@ -1280,24 +1284,13 @@ void main() {
12801284
12811285#ifdef MODE_PACK_L1_COEFFS
12821286 vec4 base_coeff = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (atlas_pos, params.atlas_slice * 4 ), 0 );
1287+ imageStore(dest_light, ivec3 (atlas_pos, params.atlas_slice * 4 ), base_coeff);
12831288
12841289 for (int i = 1 ; i < 4 ; i++ ) {
12851290 vec4 c = texelFetch(sampler2DArray (source_light, linear_sampler), ivec3 (atlas_pos, params.atlas_slice * 4 + i), 0 );
1291+ c.rgb /= (base_coeff.rgb * 8.0 + vec3 (1e- 6f));
1292+ c.rgb = clamp (c.rgb + vec3 (0.5 ), vec3 (0.0 ), vec3 (1.0 ));
12861293
1287- if (abs (base_coeff.r) > 0.0 ) {
1288- c.r /= (base_coeff.r * 8 );
1289- }
1290-
1291- if (abs (base_coeff.g) > 0.0 ) {
1292- c.g /= (base_coeff.g * 8 );
1293- }
1294-
1295- if (abs (base_coeff.b) > 0.0 ) {
1296- c.b /= (base_coeff.b * 8 );
1297- }
1298-
1299- c.rgb += vec3 (0.5 );
1300- c.rgb = clamp (c.rgb, vec3 (0.0 ), vec3 (1.0 ));
13011294 imageStore(dest_light, ivec3 (atlas_pos, params.atlas_slice * 4 + i), c);
13021295 }
13031296#endif
0 commit comments