Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-02-14 20:20:55 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-02-14 20:21:04 +0300
commit180aff7b74128161c2a57cca7ad07d54f9eb5c91 (patch)
treeaeea9999d379015c11b05ad9b5ec7e34d964f491 /source/blender/draw/intern/draw_manager.c
parent73e404697bbab6f095d1e8e912b8159338765ae0 (diff)
DRW: Fix viewport render always rendering with transparent background
Diffstat (limited to 'source/blender/draw/intern/draw_manager.c')
-rw-r--r--source/blender/draw/intern/draw_manager.c19
1 files changed, 19 insertions, 0 deletions
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);