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

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to