Workbench: Fix volumetric blending leading to corrupted render results

Use simpler premultiplied blending.
This commit is contained in:
Clément Foucault 2018-11-07 00:16:46 +01:00
parent 4c8d88b485
commit 8af53dbeab
4 changed files with 6 additions and 6 deletions

View File

@ -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;
}

View File

@ -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)

View File

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

View File

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