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:
parent
945d0269e3
commit
ba2c039b05
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue