[Bf-blender-cvs] [8af53dbeab8] blender2.8: Workbench: Fix volumetric blending leading to corrupted render results

Clément Foucault noreply at git.blender.org
Wed Nov 7 00:19:50 CET 2018


Commit: 8af53dbeab8ad692c1a0b4d82b6ac955f0b94a45
Author: Clément Foucault
Date:   Wed Nov 7 00:16:46 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB8af53dbeab8ad692c1a0b4d82b6ac955f0b94a45

Workbench: Fix volumetric blending leading to corrupted render results

Use simpler premultiplied blending.

===================================================================

M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_exec.c

===================================================================

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 */



More information about the Bf-blender-cvs mailing list