diff options
author | Jeroen Bakker <jbakker> | 2020-10-07 18:17:19 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-10-07 18:26:37 +0300 |
commit | 7c373555fd5de16905f52f0b60d46434ea3cbac6 (patch) | |
tree | 1a68981de0c90d2be6bd90c3acfc826e4e77e626 /source/blender/draw/engines/eevee/eevee_shaders.c | |
parent | afab33e0b97cc5e5278c3e8af5490b9583c3b95c (diff) |
Fix T81254: Incorrect calculation of EEVEE Transmittance Volumetrics
Regular rendering uses a custom blend mode, but render passes renders to
2 separate textures. This wasn't configured correctly inside the
fragment shaders. This patch adds a switch to configure the fragment
shader with the correct attachments.
Backport to Blender 2.83.
Reviewed By: Clément Foucault
Differential Revision: https://developer.blender.org/D9038
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_shaders.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_shaders.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index 58897272425..f46a98ed845 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -137,7 +137,7 @@ static struct { struct GPUShader *scatter_sh; struct GPUShader *scatter_with_lights_sh; struct GPUShader *volumetric_integration_sh; - struct GPUShader *volumetric_resolve_sh; + struct GPUShader *volumetric_resolve_sh[2]; struct GPUShader *volumetric_accum_sh; /* Shader strings */ @@ -854,13 +854,16 @@ struct GPUShader *EEVEE_shaders_volumes_integration_sh_get() return e_data.volumetric_integration_sh; } -struct GPUShader *EEVEE_shaders_volumes_resolve_sh_get() +struct GPUShader *EEVEE_shaders_volumes_resolve_sh_get(bool accum) { - if (e_data.volumetric_resolve_sh == NULL) { - e_data.volumetric_resolve_sh = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_volumetric_resolve_frag_glsl, e_data.lib, SHADER_DEFINES); + const int index = accum ? 1 : 0; + if (e_data.volumetric_resolve_sh[index] == NULL) { + e_data.volumetric_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib( + datatoc_volumetric_resolve_frag_glsl, + e_data.lib, + accum ? "#define VOLUMETRICS_ACCUM\n" SHADER_DEFINES : SHADER_DEFINES); } - return e_data.volumetric_resolve_sh; + return e_data.volumetric_resolve_sh[index]; } struct GPUShader *EEVEE_shaders_volumes_accum_sh_get() @@ -1409,7 +1412,8 @@ void EEVEE_shaders_free(void) DRW_SHADER_FREE_SAFE(e_data.scatter_sh); DRW_SHADER_FREE_SAFE(e_data.scatter_with_lights_sh); DRW_SHADER_FREE_SAFE(e_data.volumetric_integration_sh); - DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh); + DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh[0]); + DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh[1]); DRW_SHADER_FREE_SAFE(e_data.volumetric_accum_sh); DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh); DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh); |