[Bf-blender-cvs] [180aff7b741] master: DRW: Fix viewport render always rendering with transparent background
Clément Foucault
noreply at git.blender.org
Fri Feb 14 18:21:08 CET 2020
Commit: 180aff7b74128161c2a57cca7ad07d54f9eb5c91
Author: Clément Foucault
Date: Fri Feb 14 18:20:55 2020 +0100
Branches: master
https://developer.blender.org/rB180aff7b74128161c2a57cca7ad07d54f9eb5c91
DRW: Fix viewport render always rendering with transparent background
===================================================================
M source/blender/draw/engines/overlay/overlay_background.c
M source/blender/draw/intern/draw_manager.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c
index 6fd3cc78c65..d98a9066a8e 100644
--- a/source/blender/draw/engines/overlay/overlay_background.c
+++ b/source/blender/draw/engines/overlay/overlay_background.c
@@ -46,7 +46,13 @@ void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
{
float color_override[4] = {0.0f, 0.0f, 0.0f, 0.0f};
int background_type;
- if (!DRW_state_draw_background()) {
+
+ if (DRW_state_is_opengl_render() && !DRW_state_draw_background()) {
+ background_type = BG_SOLID;
+ zero_v3(color_override);
+ color_override[3] = 1.0f;
+ }
+ else if (!DRW_state_draw_background()) {
background_type = BG_CHECKER;
}
else if (v3d->shading.background_type == V3D_SHADING_BACKGROUND_WORLD && scene->world) {
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index f354db8e4ed..2e5d912e0df 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1595,8 +1595,27 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
DST.options.draw_background = draw_background;
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, render_viewport, NULL);
+ if (draw_background) {
+ /* HACK(fclem): In this case we need to make sure the final alpha is 1.
+ * We use the blend mode to ensure that. A better way to fix that would
+ * be to do that in the colormanagmeent shader. */
+ GPU_offscreen_bind(ofs, false);
+ GPU_clear_color(0.0f, 0.0f, 0.0f, 1.0f);
+ GPU_clear(GPU_COLOR_BIT);
+ /* Premult Alpha over black background. */
+ GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+ GPU_blend(true);
+ }
+
GPU_viewport_unbind_from_offscreen(render_viewport, ofs, do_color_management);
+ if (draw_background) {
+ /* Reset default. */
+ GPU_blend_set_func_separate(
+ GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+ GPU_blend(false);
+ }
+
/* Free temporary viewport. */
if (viewport == NULL) {
GPU_viewport_free(render_viewport);
More information about the Bf-blender-cvs
mailing list