WIP: eevee-next-world-irradiance #108304
|
@ -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)
|
||||
|
|
|
@ -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_);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue