EEVEE Next: Subsurface Scattering #107407

Merged
Miguel Pozo merged 24 commits from pragma37/blender:pull-eevee-next-sss into main 2023-06-15 15:49:12 +02:00
8 changed files with 19 additions and 3 deletions
Showing only changes of commit e6ee38d218 - Show all commits

View File

@ -95,6 +95,8 @@
/* Only during shadow rendering. */
#define SHADOW_RENDER_MAP_SLOT 13
#define RBUFS_UTILITY_TEX_SLOT 14
/* TODO(Miguel Pozo): Set the correct slot. */
#define SSS_TRANSMITTANCE_TEX_SLOT 28
pragma37 marked this conversation as resolved Outdated

Do not use slot 16 (or anything above slot 15). It is not available in all implementations.

Do not use slot 16 (or anything above slot 15). It is not available in all implementations.
/* Images. */
#define RBUFS_NORMAL_SLOT 0

View File

@ -156,6 +156,9 @@ void ForwardPipeline::sync()
opaque_ps_.bind_ssbo(RBUFS_AOV_BUF_SLOT, &inst_.film.aovs_info);
/* Textures. */
opaque_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx);
opaque_ps_.bind_texture(SSS_TRANSMITTANCE_TEX_SLOT,
inst_.subsurface.transmittance_ref_get());
/* Uniform Buffer. */
opaque_ps_.bind_ubo(CAMERA_BUF_SLOT, inst_.camera.ubo_get());
@ -182,6 +185,7 @@ void ForwardPipeline::sync()
/* Textures. */
sub.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx);
sub.bind_texture(SSS_TRANSMITTANCE_TEX_SLOT, inst_.subsurface.transmittance_ref_get());
/* Uniform Buffer. */
sub.bind_ubo(CAMERA_BUF_SLOT, inst_.camera.ubo_get());
@ -382,6 +386,8 @@ void DeferredLayer::end_sync()
eval_light_ps_.push_constant("is_last_eval_pass", is_last_eval_pass);
eval_light_ps_.bind_image(RBUFS_LIGHT_SLOT, &inst_.render_buffers.light_tx);
eval_light_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx);
eval_light_ps_.bind_texture(SSS_TRANSMITTANCE_TEX_SLOT,
inst_.subsurface.transmittance_ref_get());
inst_.lights.bind_resources(&eval_light_ps_);
inst_.shadows.bind_resources(&eval_light_ps_);

View File

@ -267,6 +267,10 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu
info.additional_info("eevee_cryptomatte_out");
}
if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE) && pipeline_type == MAT_PIPE_FORWARD) {
info.additional_info("eevee_transmittance_data");
}
if (GPU_material_flag_get(gpumat, GPU_MATFLAG_BARYCENTRIC)) {
switch (geometry_type) {
case MAT_GEOM_MESH:

View File

@ -44,6 +44,7 @@ void main()
}
else if (textureSize(gbuffer_closure_tx, 0).z >= 3) {
vec4 gbuffer_2_packed = texelFetch(gbuffer_closure_tx, ivec3(texel, 2), 0);
diffuse_data.sss_radius = gbuffer_sss_radii_unpack(gbuffer_2_packed.xyz);
diffuse_data.sss_id = gbuffer_object_id_unorm16_unpack(gbuffer_2_packed.w);
thickness = gbuffer_thickness_unpack(gbuffer_1_packed.z);
}

View File

@ -46,7 +46,7 @@ void light_eval_ex(ClosureDiffuse diffuse,
#ifdef SSS_TRANSMITTANCE
/* Transmittance evaluation first to use initial visibility without shadow. */
if (diffuse.sss_id != 0u && light.diffuse_power > 0.0) {
float delta = max(thickness, samp.occluder_delta + samp.bias);
float delta = max(thickness, -(samp.occluder_delta + samp.bias));
vec3 intensity = visibility * light.transmit_power *
light_translucent(sss_transmittance_tx,

View File

@ -58,6 +58,8 @@ void main()
g_holdout = saturate(g_holdout);
float thickness = nodetree_thickness();
vec3 diffuse_light = vec3(0.0);
vec3 reflection_light = vec3(0.0);
vec3 refraction_light = vec3(0.0);
@ -70,7 +72,7 @@ void main()
g_data.Ng,
cameraVec(g_data.P),
vP_z,
0.01 /* TODO(fclem) thickness. */,
thickness,
diffuse_light,
reflection_light);

View File

@ -39,6 +39,7 @@ GPU_SHADER_CREATE_INFO(eevee_deferred_light)
"eevee_light_data",
"eevee_shadow_data",
"eevee_deferred_base",
"eevee_transmittance_data",
"eevee_hiz_data",
"draw_view",
"draw_fullscreen")

View File

@ -182,7 +182,7 @@ GPU_SHADER_CREATE_INFO(eevee_surf_shadow)
GPU_SHADER_CREATE_INFO(eevee_transmittance_data)
.define("SSS_TRANSMITTANCE")
.sampler(0, ImageType::FLOAT_1D, "sss_transmittance_tx");
.sampler(SSS_TRANSMITTANCE_TEX_SLOT, ImageType::FLOAT_1D, "sss_transmittance_tx");
GPU_SHADER_CREATE_INFO(eevee_subsurface_eval)
pragma37 marked this conversation as resolved Outdated

Move subsurface infos to their own file.

Move subsurface infos to their own file.
.do_static_compilation(true)