WIP: eevee-next-world-irradiance #108304

Closed
Jeroen Bakker wants to merge 79 commits from Jeroen-Bakker:eevee-next-world-irradiance into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
5 changed files with 31 additions and 10 deletions
Showing only changes of commit 3b88bd559c - Show all commits

View File

@ -100,6 +100,7 @@ void Instance::init_light_bake(Depsgraph *depsgraph, draw::Manager *manager)
shadows.init();
main_view.init();
irradiance_cache.init();
reflection_probes.init();
}
void Instance::set_time(float time)

View File

@ -426,6 +426,7 @@ void IrradianceBake::sync()
sub.shader_set(inst_.shaders.static_shader_get(SURFEL_RAY));
sub.bind_ssbo(SURFEL_BUF_SLOT, &surfels_buf_);
sub.bind_ssbo(CAPTURE_BUF_SLOT, &capture_info_buf_);
inst_.reflection_probes.bind_resources(&sub);
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
sub.dispatch(&dispatch_per_surfel_);
}
@ -442,6 +443,7 @@ void IrradianceBake::sync()
pass.bind_image("irradiance_L1_a_img", &irradiance_L1_a_tx_);
pass.bind_image("irradiance_L1_b_img", &irradiance_L1_b_tx_);
pass.bind_image("irradiance_L1_c_img", &irradiance_L1_c_tx_);
inst_.reflection_probes.bind_resources(&pass);
pass.barrier(GPU_BARRIER_SHADER_STORAGE | GPU_BARRIER_SHADER_IMAGE_ACCESS);
pass.dispatch(&dispatch_per_grid_sample_);
}

View File

@ -13,6 +13,7 @@
#pragma BLENDER_REQUIRE(eevee_surfel_list_lib.glsl)
#pragma BLENDER_REQUIRE(eevee_lightprobe_lib.glsl)
#pragma BLENDER_REQUIRE(common_math_lib.glsl)
#pragma BLENDER_REQUIRE(cubemap_lib.glsl)
void irradiance_capture(vec3 L, vec3 irradiance, inout SphericalHarmonicL1 sh)
{
@ -31,6 +32,11 @@ void irradiance_capture(Surfel surfel_emitter, vec3 P, inout SphericalHarmonicL1
irradiance_capture(L, irradiance, sh);
}
vec3 irradiance_sky_sample(vec3 R)
{
return textureLod_cubemapArray(reflectionProbes, vec4(R, 0.0), 0.0).rgb;
}
void main()
{
ivec3 grid_coord = ivec3(gl_GlobalInvocationID);
@ -71,16 +77,16 @@ void main()
irradiance_capture(surfel_buf[surfel_next], P, sh);
}
else {
/* TODO(fclem): Sky radiance. */
irradiance_capture(sky_L, vec3(0.0), sh);
vec3 world_radiance = irradiance_sky_sample(sky_L);
irradiance_capture(sky_L, world_radiance, sh);
}
if (surfel_prev > -1) {
irradiance_capture(surfel_buf[surfel_prev], P, sh);
}
else {
/* TODO(fclem): Sky radiance. */
irradiance_capture(-sky_L, vec3(0.0), sh);
vec3 world_radiance = irradiance_sky_sample(-sky_L);
irradiance_capture(-sky_L, world_radiance, sh);
}
imageStore(irradiance_L0_img, grid_coord, sh.L0.M0);

View File

@ -12,6 +12,7 @@
#pragma BLENDER_REQUIRE(gpu_shader_math_base_lib.glsl)
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
#pragma BLENDER_REQUIRE(common_math_lib.glsl)
#pragma BLENDER_REQUIRE(cubemap_lib.glsl)
void radiance_transfer(inout Surfel surfel, vec3 irradiance, vec3 L)
{
@ -38,6 +39,11 @@ void radiance_transfer(inout Surfel surfel, Surfel surfel_emitter)
radiance_transfer(surfel, irradiance, L);
}
vec3 radiance_sky_sample(vec3 R)
{
return textureLod_cubemapArray(reflectionProbes, vec4(R, 0.0), 0.0).rgb;
}
void main()
{
int surfel_index = int(gl_GlobalInvocationID.x);
@ -53,16 +59,16 @@ void main()
radiance_transfer(surfel, surfel_buf[surfel.next]);
}
else {
/* TODO(fclem): Sky radiance. */
radiance_transfer(surfel, vec3(0.0), sky_L);
vec3 world_radiance = radiance_sky_sample(sky_L);
radiance_transfer(surfel, world_radiance, sky_L);
}
if (surfel.prev > -1) {
radiance_transfer(surfel, surfel_buf[surfel.prev]);
}
else {
/* TODO(fclem): Sky radiance. */
radiance_transfer(surfel, vec3(0.0), -sky_L);
vec3 world_radiance = radiance_sky_sample(-sky_L);
radiance_transfer(surfel, world_radiance, -sky_L);
}
surfel_buf[surfel_index].incomming_light_front = surfel.incomming_light_front;

View File

@ -87,7 +87,10 @@ GPU_SHADER_CREATE_INFO(eevee_surfel_list_sort)
GPU_SHADER_CREATE_INFO(eevee_surfel_ray)
.local_group_size(SURFEL_GROUP_SIZE)
.additional_info("eevee_shared", "eevee_surfel_common", "draw_view")
.additional_info("eevee_shared",
"eevee_surfel_common",
"eevee_reflection_probe_data",
"draw_view")
.compute_source("eevee_surfel_ray_comp.glsl")
.do_static_compilation(true);
@ -105,7 +108,10 @@ GPU_SHADER_CREATE_INFO(eevee_lightprobe_irradiance_ray)
.local_group_size(IRRADIANCE_GRID_GROUP_SIZE,
IRRADIANCE_GRID_GROUP_SIZE,
IRRADIANCE_GRID_GROUP_SIZE)
.additional_info("eevee_shared", "eevee_surfel_common", "draw_view")
.additional_info("eevee_shared",
"eevee_surfel_common",
"eevee_reflection_probe_data",
"draw_view")
.storage_buf(0, Qualifier::READ, "int", "list_start_buf[]")
.storage_buf(6, Qualifier::READ, "SurfelListInfoData", "list_info_buf")
.image(0, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_3D, "irradiance_L0_img")