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