EEVEE Next: Subsurface Scattering #107407
|
@ -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
|
||||
/* Images. */
|
||||
#define RBUFS_NORMAL_SLOT 0
|
||||
|
|
|
@ -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_);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
Clément Foucault
commented
Move subsurface infos to their own file. Move subsurface infos to their own file.
|
||||
.do_static_compilation(true)
|
||||
|
|
Loading…
Reference in New Issue
Do not use slot 16 (or anything above slot 15). It is not available in all implementations.