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:
Clément Foucault
2024-05-30 00:14:51 +02:00
parent 8ee8d01711
commit a6774b2930
4 changed files with 8 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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