Fix T77686: EEVEE environment pass with film transparency

When the film is set to transparent the environment pass should still be
rendered solid. otherwise it renders black.

Reviewed By: Clément Foucault

Differential Revision: https://developer.blender.org/D8046
This commit is contained in:
Jeroen Bakker 2020-07-02 11:19:12 +02:00 committed by Jeroen Bakker
parent 945d0269e3
commit ba2c039b05
4 changed files with 19 additions and 11 deletions

View File

@ -325,27 +325,31 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
if (sldata->renderpass_ubo.combined == NULL) {
sldata->renderpass_ubo.combined = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){true, true, true, true, true, false});
&(const EEVEE_RenderPassData){true, true, true, true, true, false, false});
sldata->renderpass_ubo.diff_color = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){true, false, false, false, false, true});
&(const EEVEE_RenderPassData){true, false, false, false, false, true, false});
sldata->renderpass_ubo.diff_light = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){true, true, false, false, false, false});
&(const EEVEE_RenderPassData){true, true, false, false, false, false, false});
sldata->renderpass_ubo.spec_color = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){false, false, true, false, false, false});
&(const EEVEE_RenderPassData){false, false, true, false, false, false, false});
sldata->renderpass_ubo.spec_light = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){false, false, true, true, false, false});
&(const EEVEE_RenderPassData){false, false, true, true, false, false, false});
sldata->renderpass_ubo.emit = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){false, false, false, false, true, false});
&(const EEVEE_RenderPassData){false, false, false, false, true, false, false});
sldata->renderpass_ubo.environment = DRW_uniformbuffer_create(
sizeof(EEVEE_RenderPassData),
&(const EEVEE_RenderPassData){true, true, true, true, true, false, true});
}
/* Used combined pass by default. */
@ -408,7 +412,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo);
DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo);
DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
DRW_shgroup_uniform_block_ref(grp, "renderpass_block", &stl->g_data->renderpass_ubo);
DRW_shgroup_call(grp, geom, NULL);
}
@ -1073,7 +1077,7 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
DRWPass *material_accum_ps = psl->material_accum_ps;
if (pd->render_passes & EEVEE_RENDER_PASS_ENVIRONMENT) {
material_renderpass_accumulate(
fbl, psl->background_accum_ps, pd, txl->env_accum, sldata->renderpass_ubo.combined);
fbl, psl->background_accum_ps, pd, txl->env_accum, sldata->renderpass_ubo.environment);
}
if (pd->render_passes & EEVEE_RENDER_PASS_EMIT) {
material_renderpass_accumulate(

View File

@ -417,7 +417,8 @@ typedef struct EEVEE_RenderPassData {
int renderPassGlossyLight;
int renderPassEmit;
int renderPassSSSColor;
int _pad[2];
int renderPassEnvironment;
int _pad[1];
} EEVEE_RenderPassData;
/* ************ LIGHT UBO ************* */
@ -835,6 +836,7 @@ typedef struct EEVEE_ViewLayerData {
/* Material Render passes */
struct {
struct GPUUniformBuffer *combined;
struct GPUUniformBuffer *environment;
struct GPUUniformBuffer *diff_color;
struct GPUUniformBuffer *diff_light;
struct GPUUniformBuffer *spec_color;

View File

@ -94,6 +94,7 @@ layout(std140) uniform renderpass_block
bool renderPassGlossyLight;
bool renderPassEmit;
bool renderPassSSSColor;
bool renderPassEnvironment;
};
vec3 render_pass_diffuse_mask(vec3 diffuse_color, vec3 diffuse_light)

View File

@ -3,8 +3,9 @@ uniform float backgroundAlpha;
void node_output_world(Closure surface, Closure volume, out Closure result)
{
#ifndef VOLUMETRICS
result.radiance = surface.radiance * backgroundAlpha;
result.transmittance = vec3(1.0 - backgroundAlpha);
float alpha = renderPassEnvironment ? 1.0 : backgroundAlpha;
result.radiance = surface.radiance * alpha;
result.transmittance = vec3(1.0 - alpha);
#else
result = volume;
#endif /* VOLUMETRICS */