diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-11-07 02:16:46 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-11-07 02:19:14 +0300 |
commit | 8af53dbeab8ad692c1a0b4d82b6ac955f0b94a45 (patch) | |
tree | 1f5de4fe996e5b378fe4906cf025d94d65b3a7d3 /source | |
parent | 4c8d88b48542e4e54c9ac143f82e085b6dddaff5 (diff) |
Workbench: Fix volumetric blending leading to corrupted render results
Use simpler premultiplied blending.
Diffstat (limited to 'source')
4 files changed, 6 insertions, 6 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl index 5b949a6d952..d2a4c49f7de 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl @@ -200,4 +200,7 @@ void main() length(ls_vol_isect) / length(ls_ray_dir), length(vs_ray_dir) * stepLength); #endif + + /* Convert transmitance to alpha so we can use premul blending. */ + fragColor.a = 1.0 - fragColor.a; } diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index b0c08a2dc28..38ad5c9bfba 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -83,7 +83,7 @@ void workbench_volume_engine_free(void) void workbench_volume_cache_init(WORKBENCH_Data *vedata) { - vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSMISSION | DRW_STATE_CULL_FRONT); + vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL | DRW_STATE_CULL_FRONT); } void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Object *ob, ModifierData *md) diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 17304dde802..629c5013c03 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -289,7 +289,7 @@ typedef enum { DRW_STATE_BLEND = (1 << 15), DRW_STATE_ADDITIVE = (1 << 16), DRW_STATE_MULTIPLY = (1 << 17), - DRW_STATE_TRANSMISSION = (1 << 18), + /* DRW_STATE_TRANSMISSION = (1 << 18), */ /* Not used */ DRW_STATE_CLIP_PLANES = (1 << 19), DRW_STATE_ADDITIVE_FULL = (1 << 20), /* Same as DRW_STATE_ADDITIVE but let alpha accumulate without premult. */ DRW_STATE_BLEND_PREMUL = (1 << 21), /* Use that if color is already premult by alpha. */ diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index a5d0125c2a8..2d56c7e0cfe 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -224,7 +224,7 @@ void drw_state_set(DRWState state) int test; if (CHANGED_ANY_STORE_VAR( DRW_STATE_BLEND | DRW_STATE_BLEND_PREMUL | DRW_STATE_ADDITIVE | - DRW_STATE_MULTIPLY | DRW_STATE_TRANSMISSION | DRW_STATE_ADDITIVE_FULL | + DRW_STATE_MULTIPLY | DRW_STATE_ADDITIVE_FULL | DRW_STATE_BLEND_OIT, test)) { @@ -241,9 +241,6 @@ void drw_state_set(DRWState state) else if ((state & DRW_STATE_MULTIPLY) != 0) { glBlendFunc(GL_DST_COLOR, GL_ZERO); } - else if ((state & DRW_STATE_TRANSMISSION) != 0) { - glBlendFunc(GL_ONE, GL_SRC_ALPHA); - } else if ((state & DRW_STATE_BLEND_OIT) != 0) { glBlendFuncSeparate(GL_ONE, GL_ONE, /* RGB */ GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); /* Alpha */ |