@@ -69,7 +69,7 @@ fn spatial_and_shade(@builtin(global_invocation_id) global_id: vec3<u32>) {
6969 gi_reservoirs_a [pixel_index ] = combined_reservoir ;
7070#endif
7171
72- let brdf = evaluate_diffuse_brdf (surface . material . base_color , surface . material . metallic );
72+ let brdf = evaluate_diffuse_brdf (surface . world_normal , merge_result . wi , surface . material . base_color , surface . material . metallic );
7373
7474 var pixel_color = textureLoad (view_output , global_id . xy );
7575 pixel_color += vec4 (merge_result . selected_sample_radiance * combined_reservoir . unbiased_contribution_weight * view . exposure * brdf , 0 .0 );
@@ -98,7 +98,7 @@ fn generate_initial_reservoir(world_position: vec3<f32>, world_normal: vec3<f32>
9898
9999#ifdef NO_WORLD_CACHE
100100 let direct_lighting = sample_random_light (sample_point . world_position , sample_point . world_normal , rng );
101- reservoir . radiance = direct_lighting . radiance ;
101+ reservoir . radiance = direct_lighting . radiance * saturate ( dot ( direct_lighting . wi , sample_point . world_normal )) ;
102102 reservoir . unbiased_contribution_weight = direct_lighting . inverse_pdf * uniform_hemisphere_inverse_pdf ();
103103#else
104104 reservoir . radiance = query_world_cache (sample_point . world_position , sample_point . geometric_world_normal , view . world_position , ray . t , WORLD_CACHE_CELL_LIFETIME , rng );
@@ -219,6 +219,7 @@ fn empty_reservoir() -> Reservoir {
219219struct ReservoirMergeResult {
220220 merged_reservoir : Reservoir ,
221221 selected_sample_radiance : vec3 <f32 >,
222+ wi : vec3 <f32 >,
222223}
223224
224225fn merge_reservoirs (
@@ -233,8 +234,10 @@ fn merge_reservoirs(
233234 rng : ptr <function , u32 >,
234235) -> ReservoirMergeResult {
235236 // Radiances for resampling
236- let canonical_sample_radiance = canonical_reservoir . radiance * saturate (dot (normalize (canonical_reservoir . sample_point_world_position - canonical_world_position ), canonical_world_normal ));
237- let other_sample_radiance = other_reservoir . radiance * saturate (dot (normalize (other_reservoir . sample_point_world_position - canonical_world_position ), canonical_world_normal ));
237+ let canonical_sample_wi = normalize (canonical_reservoir . sample_point_world_position - canonical_world_position );
238+ let other_sample_wi = normalize (other_reservoir . sample_point_world_position - canonical_world_position );
239+ let canonical_sample_radiance = canonical_reservoir . radiance * saturate (dot (canonical_sample_wi , canonical_world_normal ));
240+ let other_sample_radiance = other_reservoir . radiance * saturate (dot (other_sample_wi , canonical_world_normal ));
238241
239242 // Target functions for resampling and MIS
240243 let canonical_target_function_canonical_sample = luminance (canonical_sample_radiance * canonical_diffuse_brdf );
@@ -264,7 +267,7 @@ fn merge_reservoirs(
264267
265268 // Don't merge samples with huge jacobians, as it explodes the variance
266269 if canonical_target_function_other_sample_jacobian > 1 .2 {
267- return ReservoirMergeResult (canonical_reservoir , canonical_sample_radiance );
270+ return ReservoirMergeResult (canonical_reservoir , canonical_sample_radiance , canonical_sample_wi );
268271 }
269272
270273 // Resampling weight for canonical sample
@@ -294,7 +297,7 @@ fn merge_reservoirs(
294297 let inverse_target_function = select (0 .0 , 1 .0 / canonical_target_function_other_sample , canonical_target_function_other_sample > 0 .0 );
295298 combined_reservoir . unbiased_contribution_weight = combined_reservoir . weight_sum * inverse_target_function ;
296299
297- return ReservoirMergeResult (combined_reservoir , other_sample_radiance );
300+ return ReservoirMergeResult (combined_reservoir , other_sample_radiance , other_sample_wi );
298301 } else {
299302 combined_reservoir . sample_point_world_position = canonical_reservoir . sample_point_world_position ;
300303 combined_reservoir . sample_point_world_normal = canonical_reservoir . sample_point_world_normal ;
@@ -303,6 +306,6 @@ fn merge_reservoirs(
303306 let inverse_target_function = select (0 .0 , 1 .0 / canonical_target_function_canonical_sample , canonical_target_function_canonical_sample > 0 .0 );
304307 combined_reservoir . unbiased_contribution_weight = combined_reservoir . weight_sum * inverse_target_function ;
305308
306- return ReservoirMergeResult (combined_reservoir , canonical_sample_radiance );
309+ return ReservoirMergeResult (combined_reservoir , canonical_sample_radiance , canonical_sample_wi );
307310 }
308311}
0 commit comments