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
path: root/source
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
parent73e404697bbab6f095d1e8e912b8159338765ae0 (diff)
DRW: Fix viewport render always rendering with transparent background
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/engines/overlay/overlay_background.c8
-rw-r--r--source/blender/draw/intern/draw_manager.c19
2 files changed, 26 insertions, 1 deletions
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);