[Bf-blender-cvs] [e9411b8ccf2] draw-colormanagement: Overlay: Cleanup Image background implementation
Clément Foucault
noreply at git.blender.org
Fri Jan 24 19:24:20 CET 2020
Commit: e9411b8ccf27d208c1d68571ee5abb415927b5b1
Author: Clément Foucault
Date: Fri Jan 24 18:08:20 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rBe9411b8ccf27d208c1d68571ee5abb415927b5b1
Overlay: Cleanup Image background implementation
The background images are now rendered normally on a cleared
canvas. They then get masked by the render when the background
is drawn with a special blend mode.
===================================================================
M source/blender/draw/engines/overlay/overlay_background.c
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_image.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/shaders/background_frag.glsl
M source/blender/draw/engines/overlay/shaders/image_frag.glsl
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager_exec.c
M source/blender/draw/intern/draw_view.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c
index 5128f43e78e..e4f891dc797 100644
--- a/source/blender/draw/engines/overlay/overlay_background.c
+++ b/source/blender/draw/engines/overlay/overlay_background.c
@@ -29,13 +29,14 @@ void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
OVERLAY_PassList *psl = vedata->psl;
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- DRWState state = DRW_STATE_WRITE_COLOR;
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
DRW_PASS_CREATE(psl->background_ps, state);
GPUShader *sh = OVERLAY_shader_background();
DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuf", &dtxl->color);
+ DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 4df51db6083..d0757ced053 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -395,7 +395,13 @@ static void OVERLAY_draw_scene(void *vedata)
DRW_view_set_active(NULL);
+ if (DRW_state_is_fbo()) {
+ GPU_framebuffer_bind(fbl->overlay_color_only_fb);
+ }
+
+ OVERLAY_image_background_draw(vedata);
OVERLAY_background_draw(vedata);
+
OVERLAY_outline_draw(vedata);
if (DRW_state_is_fbo()) {
diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c
index cda55fcfb5e..e82335b80ff 100644
--- a/source/blender/draw/engines/overlay/overlay_image.c
+++ b/source/blender/draw/engines/overlay/overlay_image.c
@@ -53,11 +53,8 @@ void OVERLAY_image_cache_init(OVERLAY_Data *vedata)
OVERLAY_PrivateData *pd = vedata->stl->pd;
DRWState state;
- state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_GREATER | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL;
- DRW_PASS_CREATE(psl->image_background_under_ps, state);
-
- state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
- DRW_PASS_CREATE(psl->image_background_over_ps, state);
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_GREATER | DRW_STATE_BLEND_ALPHA_PREMUL;
+ DRW_PASS_CREATE(psl->image_background_ps, state);
state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
DRW_PASS_CREATE(psl->image_empties_ps, state | pd->clipping_state);
@@ -326,29 +323,18 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
mul_m4_m4m4(mat, norm_obmat, mat);
const bool is_foreground = (bgpic->flag & CAM_BGIMG_FLAG_FOREGROUND) != 0;
- float color_alpha[4] = {1.0f, 1.0f, 1.0f, bgpic->alpha};
float color_premult_alpha[4] = {bgpic->alpha, bgpic->alpha, bgpic->alpha, bgpic->alpha};
- /* When drawing background we do 2 passes.
- * - One alpha over, which works where background is visible.
- * - One alpha under, works under partially visible objects. (only in cycles)
- * This approach is not ideal and should be revisited.
- **/
- for (int i = 0; i < (is_foreground ? 1 : 2); i++) {
- DRWPass *pass = is_foreground ? psl->image_foreground_ps :
- ((i == 0) ? psl->image_background_under_ps :
- psl->image_background_over_ps);
- GPUShader *sh = OVERLAY_shader_image();
- DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
- float *color = (is_foreground || i == 1) ? color_alpha : color_premult_alpha;
- DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
- DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult);
- DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true);
- DRW_shgroup_uniform_bool_copy(grp, "imgLinear", !DRW_state_do_color_management());
- DRW_shgroup_uniform_bool_copy(grp, "depthSet", true);
- DRW_shgroup_uniform_vec4_copy(grp, "color", color);
- DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat);
- }
+ DRWPass *pass = is_foreground ? psl->image_foreground_ps : psl->image_background_ps;
+
+ GPUShader *sh = OVERLAY_shader_image();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+ DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
+ DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult);
+ DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true);
+ DRW_shgroup_uniform_bool_copy(grp, "depthSet", true);
+ DRW_shgroup_uniform_vec4_copy(grp, "color", color_premult_alpha);
+ DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat);
}
}
}
@@ -423,7 +409,6 @@ void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult);
DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", use_alpha_blend);
- DRW_shgroup_uniform_bool_copy(grp, "imgLinear", false);
DRW_shgroup_uniform_bool_copy(grp, "depthSet", depth_mode != OB_EMPTY_IMAGE_DEPTH_DEFAULT);
DRW_shgroup_uniform_vec4_copy(grp, "color", ob->color);
DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat);
@@ -434,30 +419,25 @@ void OVERLAY_image_cache_finish(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
- DRW_pass_sort_shgroup_reverse(psl->image_background_under_ps);
DRW_pass_sort_shgroup_z(psl->image_empties_blend_ps);
DRW_pass_sort_shgroup_z(psl->image_empties_front_ps);
DRW_pass_sort_shgroup_z(psl->image_empties_back_ps);
}
+void OVERLAY_image_background_draw(OVERLAY_Data *vedata)
+{
+ OVERLAY_PassList *psl = vedata->psl;
+
+ DRW_draw_pass(psl->image_background_ps);
+ DRW_draw_pass(psl->image_empties_back_ps);
+}
+
void OVERLAY_image_draw(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
OVERLAY_PrivateData *pd = vedata->stl->pd;
- OVERLAY_FramebufferList *fbl = vedata->fbl;
-
- const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DRW_view_set_active(pd->view_reference_images);
- DRW_draw_pass(psl->image_background_over_ps);
-
- if (DRW_state_is_fbo() && !DRW_pass_is_empty(psl->image_background_under_ps)) {
- GPU_framebuffer_bind(dfbl->default_fb);
- DRW_draw_pass(psl->image_background_under_ps);
- GPU_framebuffer_bind(fbl->overlay_default_fb);
- }
-
- DRW_draw_pass(psl->image_empties_back_ps);
DRW_draw_pass(psl->image_empties_ps);
DRW_draw_pass(psl->image_empties_blend_ps);
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 2c3d697c03a..7a1ec41c485 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -76,8 +76,7 @@ typedef struct OVERLAY_PassList {
DRWPass *extra_grid_ps;
DRWPass *facing_ps;
DRWPass *grid_ps;
- DRWPass *image_background_under_ps;
- DRWPass *image_background_over_ps;
+ DRWPass *image_background_ps;
DRWPass *image_empties_ps;
DRWPass *image_empties_back_ps;
DRWPass *image_empties_blend_ps;
@@ -478,6 +477,7 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob);
void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob);
void OVERLAY_image_cache_finish(OVERLAY_Data *vedata);
void OVERLAY_image_draw(OVERLAY_Data *vedata);
+void OVERLAY_image_background_draw(OVERLAY_Data *vedata);
void OVERLAY_image_in_front_draw(OVERLAY_Data *vedata);
void OVERLAY_metaball_cache_init(OVERLAY_Data *vedata);
diff --git a/source/blender/draw/engines/overlay/shaders/background_frag.glsl b/source/blender/draw/engines/overlay/shaders/background_frag.glsl
index ba1d347783b..7575509adcf 100644
--- a/source/blender/draw/engines/overlay/shaders/background_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/background_frag.glsl
@@ -1,5 +1,6 @@
-uniform sampler2D colorBuf;
+uniform sampler2D colorBuffer;
+uniform sampler2D depthBuffer;
in vec4 uvcoordsvar;
@@ -7,9 +8,22 @@ out vec4 fragColor;
void main()
{
- float alpha = texture(colorBuf, uvcoordsvar.st).a;
+ /* The blend equation is:
+ * resutl.rgb = SRC.rgb * (1 - DST.a) + DST.rgb * (SRC.a)
+ * result.a = SRC.a * 0 + DST.a * SRC.a
+ * This removes the alpha channel and put the background behind reference images
+ * while masking the reference images by the render alpha.
+ */
+ float alpha = texture(colorBuffer, uvcoordsvar.st).a;
+ float depth = texture(depthBuffer, uvcoordsvar.st).r;
+
/* Mimic alpha under behavior. Result is premultiplied. */
- fragColor = vec4(colorBackground.rgb, 0.0) * (1.0 - alpha);
+ fragColor = vec4(colorBackground.rgb, 1.0) * (1.0 - alpha);
+
+ /* Special case: If the render is not transparent, do not clear alpha values. */
+ if (depth == 1.0 && alpha == 1.0) {
+ fragColor.a = 1.0;
+ }
/* TODO Gradient Background. */
/* TODO Alpha checker Background. */
diff --git a/source/blender/draw/engines/overlay/shaders/image_frag.glsl b/source/blender/draw/engines/overlay/shaders/image_frag.glsl
index 0da7067851d..298ba1e27ed 100644
--- a/source/blender/draw/engines/overlay/shaders/image_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/image_frag.glsl
@@ -2,7 +2,6 @@
uniform sampler2D imgTexture;
uniform bool imgPremultiplied;
uniform bool imgAlphaBlend;
-uniform bool imgLinear;
uniform vec4 color;
in vec2 uvs;
@@ -13,12 +12,8 @@ void main()
{
vec2 uvs_clamped = clamp(uvs, 0.0, 1.0);
vec4 tex_color;
- if (imgLinear) {
- tex_color = texture_read_as_linearrgb(imgTexture, imgPremultiplied, uvs_clamped);
- }
- else {
- tex_color = texture_read_as_srgb(imgTexture, imgPremultiplied, uvs_clamped);
- }
+ tex_color = texture_read_as_linearrgb(imgTexture, imgPremultiplied, uvs_clamped);
+
fragColor = tex_color
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list