diff options
4 files changed, 28 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 73eaeaa3f07..a58e6e20c58 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -267,6 +267,7 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(veda sldata->probes = MEM_callocN(sizeof(EEVEE_LightProbesInfo), "EEVEE_LightProbesInfo"); sldata->probes->specular_toggle = true; sldata->probes->ssr_toggle = true; + sldata->probes->sss_toggle = true; sldata->probes->grid_initialized = false; sldata->probe_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_LightProbe) * MAX_PROBE, NULL); sldata->grid_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_LightGrid) * MAX_GRID, NULL); @@ -1009,6 +1010,7 @@ static void render_scene_to_probe( /* Disable specular lighting when rendering probes to avoid feedback loops (looks bad). */ sldata->probes->specular_toggle = false; sldata->probes->ssr_toggle = false; + sldata->probes->sss_toggle = false; /* Disable AO until we find a way to hide really bad discontinuities between cubefaces. */ tmp_ao_dist = stl->effects->ao_dist; @@ -1092,6 +1094,7 @@ static void render_scene_to_probe( /* Restore */ pinfo->specular_toggle = true; pinfo->ssr_toggle = true; + pinfo->sss_toggle = true; txl->planar_pool = tmp_planar_pool; stl->g_data->minzbuffer = tmp_minz; txl->maxzbuffer = tmp_maxz; @@ -1139,6 +1142,7 @@ static void render_scene_to_planar( /* Turn off ssr to avoid black specular */ /* TODO : Enable SSR in planar reflections? (Would be very heavy) */ sldata->probes->ssr_toggle = false; + sldata->probes->sss_toggle = false; /* Avoid using the texture attached to framebuffer when rendering. */ /* XXX */ @@ -1172,6 +1176,7 @@ static void render_scene_to_planar( /* Restore */ sldata->probes->ssr_toggle = true; + sldata->probes->sss_toggle = true; txl->planar_pool = tmp_planar_pool; txl->planar_depth = tmp_planar_depth; DRW_viewport_matrix_override_unset(DRW_MAT_PERS); diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 77d57716852..38f2aab4443 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -352,7 +352,7 @@ static char *eevee_get_volume_defines(int options) **/ static void add_standard_uniforms( DRWShadingGroup *shgrp, EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, - int *ssr_id, float *refract_depth, bool use_ssrefraction, bool use_alpha_blend) + int *ssr_id, float *refract_depth, bool use_ssrefraction, bool use_alpha_blend, bool use_sss) { if (ssr_id == NULL || !vedata->stl->g_data->valid_double_buffer) { static int no_ssr = -1.0f; @@ -409,6 +409,10 @@ static void add_standard_uniforms( DRW_shgroup_uniform_vec2(shgrp, "volume_uv_ratio", (float *)sldata->volumetrics->volume_coord_scale, 1); DRW_shgroup_uniform_vec3(shgrp, "volume_param", (float *)sldata->volumetrics->depth_param, 1); } + + if (use_sss) { + DRW_shgroup_uniform_bool(shgrp, "sssToggle", &sldata->probes->sss_toggle, 1); + } } static void create_default_shader(int options) @@ -790,7 +794,7 @@ static struct DRWShadingGroup *EEVEE_default_shading_group_create( } DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit[options], pass); - add_standard_uniforms(shgrp, sldata, vedata, &ssr_id, NULL, false, use_blend); + add_standard_uniforms(shgrp, sldata, vedata, &ssr_id, NULL, false, use_blend, false); return shgrp; } @@ -820,7 +824,7 @@ static struct DRWShadingGroup *EEVEE_default_shading_group_get( vedata->psl->default_pass[options] = DRW_pass_create("Default Lit Pass", state); DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]); - add_standard_uniforms(shgrp, sldata, vedata, &ssr_id, NULL, false, false); + add_standard_uniforms(shgrp, sldata, vedata, &ssr_id, NULL, false, false, false); } return DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]); @@ -1017,7 +1021,7 @@ static void material_opaque( static int no_ssr = -1; static int first_ssr = 1; int *ssr_id = (stl->effects->use_ssr && !use_refract) ? &first_ssr : &no_ssr; - add_standard_uniforms(*shgrp, sldata, vedata, ssr_id, &ma->refract_depth, use_refract, false); + add_standard_uniforms(*shgrp, sldata, vedata, ssr_id, &ma->refract_depth, use_refract, false, use_sss); if (use_sss) { struct GPUTexture *sss_tex_profile = NULL; @@ -1062,7 +1066,7 @@ static void material_opaque( } if (*shgrp_depth != NULL) { - add_standard_uniforms(*shgrp_depth, sldata, vedata, NULL, NULL, false, false); + add_standard_uniforms(*shgrp_depth, sldata, vedata, NULL, NULL, false, false, false); if (ma->blend_method == MA_BM_CLIP) { DRW_shgroup_uniform_float(*shgrp_depth, "alphaThreshold", &ma->alpha_threshold, 1); @@ -1126,7 +1130,7 @@ static void material_transparent( if (*shgrp) { static int ssr_id = -1; /* TODO transparent SSR */ bool use_blend = (ma->blend_method & MA_BM_BLEND) != 0; - add_standard_uniforms(*shgrp, sldata, vedata, &ssr_id, &ma->refract_depth, use_refract, use_blend); + add_standard_uniforms(*shgrp, sldata, vedata, &ssr_id, &ma->refract_depth, use_refract, use_blend, false); } else { /* Shader failed : pink color */ @@ -1378,7 +1382,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass); if (shgrp) { - add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false); + add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false, false); BLI_ghash_insert(material_hash, ma, shgrp); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 93fc3ee27d3..8e754e71506 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -409,6 +409,7 @@ typedef struct EEVEE_LightProbesInfo { int shnbr; bool specular_toggle; bool ssr_toggle; + bool sss_toggle; /* List of probes in the scene. */ /* XXX This is fragile, can get out of sync quickly. */ struct Object *probes_cube_ref[MAX_PROBE]; diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl index 54825303b5d..f02812e3e6e 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl @@ -656,6 +656,8 @@ Closure closure_add(Closure cl1, Closure cl2) return cl; } +uniform bool sssToggle; + #if defined(MESH_SHADER) && !defined(USE_ALPHA_HASH) && !defined(USE_ALPHA_CLIP) && !defined(SHADOW_SHADER) && !defined(USE_MULTIPLY) layout(location = 0) out vec4 fragColor; #ifdef USE_SSS @@ -702,6 +704,15 @@ void main() sssAlbedo = cl.sss_albedo.rgbb; #endif #endif + + /* For Probe capture */ +#ifdef USE_SSS +#ifdef USE_SSS_ALBEDO + fragColor.rgb += cl.sss_data.rgb * cl.sss_albedo.rgb * float(!sssToggle); +#else + fragColor.rgb += cl.sss_data.rgb * float(!sssToggle); +#endif +#endif } #endif /* MESH_SHADER && !SHADOW_SHADER */ |