EEVEE-Next: Add pdf to LOD to reduce noise from HDRI
Sphere lightprobe have pre-filtered LODs. Sample lower LODs when PDF is high to reduce variance.
This commit is contained in:
@@ -79,15 +79,16 @@ vec3 lightprobe_spherical_sample_normalized_with_parallax(LightProbeSample samp,
|
||||
return normalization_factor * lightprobe_spheres_sample(L, lod, probe.atlas_coord).rgb;
|
||||
}
|
||||
|
||||
float pdf_to_lod(float pdf)
|
||||
float pdf_to_lod(float inv_pdf)
|
||||
{
|
||||
return 0.0; /* TODO */
|
||||
float blur_pdf = saturate((2.0 * M_PI) * inv_pdf);
|
||||
return blur_pdf * 0.0;
|
||||
}
|
||||
|
||||
vec3 lightprobe_eval_direction(LightProbeSample samp, vec3 P, vec3 L, float pdf)
|
||||
vec3 lightprobe_eval_direction(LightProbeSample samp, vec3 P, vec3 L, float inv_pdf)
|
||||
{
|
||||
vec3 radiance_sh = lightprobe_spherical_sample_normalized_with_parallax(
|
||||
samp, P, L, pdf_to_lod(pdf));
|
||||
samp, P, L, pdf_to_lod(inv_pdf));
|
||||
return radiance_sh;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,8 +70,7 @@ void main()
|
||||
float clamp_indirect = uniform_buf.clamp.surface_indirect;
|
||||
samp.volume_irradiance = spherical_harmonics_clamp(samp.volume_irradiance, clamp_indirect);
|
||||
|
||||
vec3 radiance = lightprobe_eval_direction(
|
||||
samp, ray.origin, ray.direction, safe_rcp(ray_pdf_inv));
|
||||
vec3 radiance = lightprobe_eval_direction(samp, ray.origin, ray.direction, ray_pdf_inv);
|
||||
/* Set point really far for correct reprojection of background. */
|
||||
float hit_time = 1000.0;
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ void main()
|
||||
vec3 Ng = ray.direction;
|
||||
/* Fallback to nearest light-probe. */
|
||||
LightProbeSample samp = lightprobe_load(P, Ng, V);
|
||||
radiance = lightprobe_eval_direction(samp, P, ray.direction, safe_rcp(ray_pdf_inv));
|
||||
radiance = lightprobe_eval_direction(samp, P, ray.direction, ray_pdf_inv);
|
||||
/* Set point really far for correct reprojection of background. */
|
||||
hit.time = 10000.0;
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ void main()
|
||||
float clamp_indirect = uniform_buf.clamp.surface_indirect;
|
||||
samp.volume_irradiance = spherical_harmonics_clamp(samp.volume_irradiance, clamp_indirect);
|
||||
|
||||
radiance = lightprobe_eval_direction(samp, ray.origin, ray.direction, safe_rcp(ray_pdf_inv));
|
||||
radiance = lightprobe_eval_direction(samp, ray.origin, ray.direction, ray_pdf_inv);
|
||||
/* Set point really far for correct reprojection of background. */
|
||||
hit.time = 10000.0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user