Workbench: Fix volumetric blending leading to corrupted render results
Use simpler premultiplied blending.
This commit is contained in:
parent
4c8d88b485
commit
8af53dbeab
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue