Eevee: Add SSS support in probes

Previously the lighting of SSS material was not present in reflection probe or irradiance grid.

This does not compute the SSS correctly but at least output the corresponding irradiance power to the correct output.
This commit is contained in:
Clément Foucault 2017-11-25 17:39:21 +01:00
parent 974ffaa39d
commit 5dfeecf47b
4 changed files with 28 additions and 7 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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];

View File

@ -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
@ -701,6 +703,15 @@ void main()
#ifdef USE_SSS_ALBEDO
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
}