Add jacobian
This commit is contained in:
parent
184ad9fef5
commit
c47218ab0c
@ -153,6 +153,17 @@ fn load_spatial_reservoir(pixel_id: vec2<u32>, depth: f32, world_position: vec3<
|
|||||||
let spatial_pixel_index = spatial_pixel_id.x + spatial_pixel_id.y * u32(view.viewport.z);
|
let spatial_pixel_index = spatial_pixel_id.x + spatial_pixel_id.y * u32(view.viewport.z);
|
||||||
var spatial_reservoir = gi_reservoirs_b[spatial_pixel_index];
|
var spatial_reservoir = gi_reservoirs_b[spatial_pixel_index];
|
||||||
|
|
||||||
|
var jacobian = jacobian(
|
||||||
|
world_position,
|
||||||
|
spatial_world_position,
|
||||||
|
spatial_reservoir.sample_point_world_position,
|
||||||
|
spatial_reservoir.sample_point_world_normal
|
||||||
|
);
|
||||||
|
if jacobian > 10.0 || jacobian < 0.1 {
|
||||||
|
return empty_reservoir();
|
||||||
|
}
|
||||||
|
spatial_reservoir.unbiased_contribution_weight *= jacobian;
|
||||||
|
|
||||||
spatial_reservoir.unbiased_contribution_weight *= trace_point_visibility(world_position, spatial_reservoir.sample_point_world_position);
|
spatial_reservoir.unbiased_contribution_weight *= trace_point_visibility(world_position, spatial_reservoir.sample_point_world_position);
|
||||||
|
|
||||||
return spatial_reservoir;
|
return spatial_reservoir;
|
||||||
@ -164,6 +175,30 @@ fn get_neighbor_pixel_id(center_pixel_id: vec2<u32>, rng: ptr<function, u32>) ->
|
|||||||
return vec2<u32>(spatial_id);
|
return vec2<u32>(spatial_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn jacobian(
|
||||||
|
world_position: vec3<f32>,
|
||||||
|
spatial_world_position: vec3<f32>,
|
||||||
|
sample_point_world_position: vec3<f32>,
|
||||||
|
sample_point_world_normal: vec3<f32>,
|
||||||
|
) -> f32 {
|
||||||
|
let r = world_position - sample_point_world_position;
|
||||||
|
let q = spatial_world_position - sample_point_world_position;
|
||||||
|
let rl = length(r);
|
||||||
|
let ql = length(q);
|
||||||
|
let phi_r = saturate(dot(r / rl, sample_point_world_normal));
|
||||||
|
let phi_q = saturate(dot(q / ql, sample_point_world_normal));
|
||||||
|
let jacobian = (phi_r * ql * ql) / (phi_q * rl * rl);
|
||||||
|
return select(jacobian, 0.0, isinf(jacobian) || isnan(jacobian));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isinf(x: f32) -> bool {
|
||||||
|
return (bitcast<u32>(x) & 0x7fffffffu) == 0x7f800000u;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isnan(x: f32) -> bool {
|
||||||
|
return (bitcast<u32>(x) & 0x7fffffffu) > 0x7f800000u;
|
||||||
|
}
|
||||||
|
|
||||||
fn reconstruct_world_position(pixel_id: vec2<u32>, depth: f32) -> vec3<f32> {
|
fn reconstruct_world_position(pixel_id: vec2<u32>, depth: f32) -> vec3<f32> {
|
||||||
let uv = (vec2<f32>(pixel_id) + 0.5) / view.viewport.zw;
|
let uv = (vec2<f32>(pixel_id) + 0.5) / view.viewport.zw;
|
||||||
let xy_ndc = (uv - vec2(0.5)) * vec2(2.0, -2.0);
|
let xy_ndc = (uv - vec2(0.5)) * vec2(2.0, -2.0);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user