Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-11-07 02:16:46 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-11-07 02:19:14 +0300
commit8af53dbeab8ad692c1a0b4d82b6ac955f0b94a45 (patch)
tree1f5de4fe996e5b378fe4906cf025d94d65b3a7d3 /source
parent4c8d88b48542e4e54c9ac143f82e085b6dddaff5 (diff)
Workbench: Fix volumetric blending leading to corrupted render results
Use simpler premultiplied blending.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl3
-rw-r--r--source/blender/draw/engines/workbench/workbench_volume.c2
-rw-r--r--source/blender/draw/intern/DRW_render.h2
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c5
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 */