Fix visibility (re)use in Solari DI (#20113)
# Objective Fixes the re(use) of visibility in Solari's ReSTIR DI. The paper I based things off of didn't (seem) to use visibility in their resampling https://yusuketokuyoshi.com/papers/2024/Efficient_Visibility_Reuse_for_Real-time_ReSTIR_(Supplementary_Document).pdf, only shading, but factoring it into the resampling improves things a lot. --- ## Showcase Before: <img width="2564" height="1500" alt="image" src="https://github.com/user-attachments/assets/15fa7941-ab68-47bc-9bbc-42ca55359046" /> After: <img width="2564" height="1500" alt="image" src="https://github.com/user-attachments/assets/6fe52ed0-7832-41c1-b1cd-e8c8d9825e51" />
This commit is contained in:
parent
7ae8b53923
commit
84936cad55
@ -112,7 +112,6 @@ fn generate_initial_reservoir(world_position: vec3<f32>, world_normal: vec3<f32>
|
|||||||
reservoir.unbiased_contribution_weight = reservoir.weight_sum * inverse_target_function;
|
reservoir.unbiased_contribution_weight = reservoir.weight_sum * inverse_target_function;
|
||||||
|
|
||||||
reservoir.visibility = trace_light_visibility(reservoir.sample, world_position);
|
reservoir.visibility = trace_light_visibility(reservoir.sample, world_position);
|
||||||
reservoir.unbiased_contribution_weight *= reservoir.visibility;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reservoir.confidence_weight = 1.0;
|
reservoir.confidence_weight = 1.0;
|
||||||
@ -175,8 +174,8 @@ fn load_spatial_reservoir(pixel_id: vec2<u32>, depth: f32, world_position: vec3<
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_neighbor_pixel_id(center_pixel_id: vec2<u32>, rng: ptr<function, u32>) -> vec2<u32> {
|
fn get_neighbor_pixel_id(center_pixel_id: vec2<u32>, rng: ptr<function, u32>) -> vec2<u32> {
|
||||||
var spatial_id = vec2<i32>(center_pixel_id) + vec2<i32>(sample_disk(SPATIAL_REUSE_RADIUS_PIXELS, rng));
|
var spatial_id = vec2<f32>(center_pixel_id) + sample_disk(SPATIAL_REUSE_RADIUS_PIXELS, rng);
|
||||||
spatial_id = clamp(spatial_id, vec2(0i), vec2<i32>(view.viewport.zw) - 1i);
|
spatial_id = clamp(spatial_id, vec2(0.0), view.viewport.zw - 1.0);
|
||||||
return vec2<u32>(spatial_id);
|
return vec2<u32>(spatial_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +287,7 @@ fn merge_reservoirs(
|
|||||||
|
|
||||||
fn reservoir_target_function(reservoir: Reservoir, world_position: vec3<f32>, world_normal: vec3<f32>, diffuse_brdf: vec3<f32>) -> vec4<f32> {
|
fn reservoir_target_function(reservoir: Reservoir, world_position: vec3<f32>, world_normal: vec3<f32>, diffuse_brdf: vec3<f32>) -> vec4<f32> {
|
||||||
if !reservoir_valid(reservoir) { return vec4(0.0); }
|
if !reservoir_valid(reservoir) { return vec4(0.0); }
|
||||||
let light_contribution = calculate_light_contribution(reservoir.sample, world_position, world_normal).radiance;
|
let light_contribution = calculate_light_contribution(reservoir.sample, world_position, world_normal).radiance * reservoir.visibility;
|
||||||
let target_function = luminance(light_contribution * diffuse_brdf);
|
let target_function = luminance(light_contribution * diffuse_brdf);
|
||||||
return vec4(light_contribution, target_function);
|
return vec4(light_contribution, target_function);
|
||||||
}
|
}
|
||||||
|
@ -172,8 +172,8 @@ fn load_spatial_reservoir(pixel_id: vec2<u32>, depth: f32, world_position: vec3<
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_neighbor_pixel_id(center_pixel_id: vec2<u32>, rng: ptr<function, u32>) -> vec2<u32> {
|
fn get_neighbor_pixel_id(center_pixel_id: vec2<u32>, rng: ptr<function, u32>) -> vec2<u32> {
|
||||||
var spatial_id = vec2<i32>(center_pixel_id) + vec2<i32>(sample_disk(SPATIAL_REUSE_RADIUS_PIXELS, rng));
|
var spatial_id = vec2<f32>(center_pixel_id) + sample_disk(SPATIAL_REUSE_RADIUS_PIXELS, rng);
|
||||||
spatial_id = clamp(spatial_id, vec2(0i), vec2<i32>(view.viewport.zw) - 1i);
|
spatial_id = clamp(spatial_id, vec2(0.0), view.viewport.zw - 1.0);
|
||||||
return vec2<u32>(spatial_id);
|
return vec2<u32>(spatial_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: Initial raytraced lighting progress (bevy_solari)
|
title: Initial raytraced lighting progress (bevy_solari)
|
||||||
authors: ["@JMS55"]
|
authors: ["@JMS55"]
|
||||||
pull_requests: [19058, 19620, 19790, 20020]
|
pull_requests: [19058, 19620, 19790, 20020, 20113]
|
||||||
---
|
---
|
||||||
|
|
||||||
(TODO: Embed solari example screenshot here)
|
(TODO: Embed solari example screenshot here)
|
||||||
|
Loading…
Reference in New Issue
Block a user