[Bf-blender-cvs] [691c6f94bbb] draw-colormanagement: Cleanup: Workbench: Remove background code

Clément Foucault noreply at git.blender.org
Fri Jan 31 04:22:29 CET 2020


Commit: 691c6f94bbbddecf04b22fa201fc22b0589fdc67
Author: Clément Foucault
Date:   Fri Jan 31 04:21:56 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rB691c6f94bbbddecf04b22fa201fc22b0589fdc67

Cleanup: Workbench: Remove background code

We now use clear color to apply background color in render mode.

===================================================================

M	source/blender/draw/CMakeLists.txt
D	source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 458f85d892a..9dd6a3b97fc 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -240,7 +240,6 @@ data_to_c_simple(engines/eevee/shaders/volumetric_resolve_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
-data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_cavity_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_cavity_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
deleted file mode 100644
index 3ac220aee59..00000000000
--- a/source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-vec3 background_color(WorldData world_data, float y)
-{
-  return mix(world_data.background_color_low, world_data.background_color_high, y).xyz +
-         (world_data.background_dither_factor * bayer_dither_noise());
-}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index f60eca24821..0c984b094d3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -5,17 +5,12 @@ struct LightData {
 };
 
 struct WorldData {
-  vec4 background_color_low;
-  vec4 background_color_high;
   vec4 object_outline_color;
   vec4 shadow_direction_vs;
   LightData lights[4];
   vec4 ambient_color;
   int num_lights;
   int matcap_orientation;
-  float background_alpha;
   float curvature_ridge;
   float curvature_valley;
-  float background_dither_factor;
-  int pad[2];
 };
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
index e956894727d..22fa2babbbf 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
@@ -13,7 +13,6 @@ layout(std140) uniform world_block
 void main()
 {
   vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
-  vec3 background = background_color(world_data, uv_viewport.y);
 
 #ifndef V3D_SHADING_OBJECT_OUTLINE
 
@@ -25,16 +24,7 @@ void main()
   uint object_id = texelFetch(objectId, texel, 0).r;
   float object_outline = calculate_object_outline(objectId, texel, object_id);
 
-  if (object_outline == 0.0) {
-    fragColor = vec4(0.0);
-  }
-  else {
-    /* Do correct alpha blending. */
-    vec4 background_color = vec4(0.0);
-    vec4 outline_color = vec4(world_data.object_outline_color.rgb, 1.0);
-    fragColor = mix(outline_color, background_color, object_outline);
-    fragColor = vec4(fragColor.rgb / max(1e-8, fragColor.a), fragColor.a);
-  }
+  fragColor = vec4(world_data.object_outline_color.rgb, 1.0) * (1.0 - object_outline);
 
 #endif /* !V3D_SHADING_OBJECT_OUTLINE */
 }
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 051a1c9240a..056e6a6c364 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -99,8 +99,27 @@ static void workbench_world_data_update_shadow_direction_vs(WORKBENCH_PrivateDat
   /* Shadow direction. */
   mul_v3_mat3_m4v3(wd->shadow_direction_vs, view_matrix, light_direction);
 }
+
 /* \} */
 
+void workbench_clear_color_get(float color[4])
+{
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  const Scene *scene = draw_ctx->scene;
+
+  if (!DRW_state_is_scene_render() || !DRW_state_draw_background()) {
+    zero_v4(color);
+  }
+  else if (scene->world) {
+    copy_v3_v3(color, &scene->world->horr);
+    color[3] = 1.0f;
+  }
+  else {
+    zero_v3(color);
+    color[3] = 1.0f;
+  }
+}
+
 void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info)
 {
   effect_info->jitter_index = 0;
@@ -152,39 +171,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 
   WORKBENCH_UBO_World *wd = &wpd->world_data;
   wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
-  wd->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
-
-  if ((scene->world != NULL) &&
-      (!v3d || (v3d && ((v3d->shading.background_type == V3D_SHADING_BACKGROUND_WORLD) ||
-                        (v3d->shading.type == OB_RENDER))))) {
-    copy_v3_v3(wd->background_color_low, &scene->world->horr);
-    copy_v3_v3(wd->background_color_high, &scene->world->horr);
-  }
-  else if (v3d && (v3d->shading.background_type == V3D_SHADING_BACKGROUND_VIEWPORT)) {
-    copy_v3_v3(wd->background_color_low, v3d->shading.background_color);
-    copy_v3_v3(wd->background_color_high, v3d->shading.background_color);
-  }
-  else if (v3d) {
-    UI_GetThemeColor3fv(UI_GetThemeValue(TH_SHOW_BACK_GRAD) ? TH_BACK_GRAD : TH_BACK,
-                        wd->background_color_low);
-    UI_GetThemeColor3fv(TH_BACK, wd->background_color_high);
-
-    /* XXX: Really quick conversion to avoid washed out background.
-     * Needs to be addressed properly (color managed using ocio). */
-    if (wpd->use_color_management) {
-      srgb_to_linearrgb_v3_v3(wd->background_color_high, wd->background_color_high);
-      srgb_to_linearrgb_v3_v3(wd->background_color_low, wd->background_color_low);
-    }
-    else {
-      copy_v3_v3(wd->background_color_high, wd->background_color_high);
-      copy_v3_v3(wd->background_color_low, wd->background_color_low);
-    }
-  }
-  else {
-    zero_v3(wd->background_color_low);
-    zero_v3(wd->background_color_high);
-  }
-  wd->background_dither_factor = workbench_background_dither_factor(wpd);
 
   studiolight_update_world(wpd, wpd->studio_light, wd);
 
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 393f6009379..3421ec8125e 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -105,7 +105,6 @@ extern char datatoc_workbench_shadow_geom_glsl[];
 extern char datatoc_workbench_shadow_caps_geom_glsl[];
 extern char datatoc_workbench_shadow_debug_frag_glsl[];
 
-extern char datatoc_workbench_background_lib_glsl[];
 extern char datatoc_workbench_cavity_lib_glsl[];
 extern char datatoc_workbench_common_lib_glsl[];
 extern char datatoc_workbench_data_lib_glsl[];
@@ -122,7 +121,6 @@ static char *workbench_build_composite_frag(WORKBENCH_PrivateData *wpd)
   BLI_dynstr_append(ds, datatoc_common_view_lib_glsl);
   BLI_dynstr_append(ds, datatoc_workbench_data_lib_glsl);
   BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
-  BLI_dynstr_append(ds, datatoc_workbench_background_lib_glsl);
 
   if (!FLAT_ENABLED(wpd)) {
     BLI_dynstr_append(ds, datatoc_workbench_world_light_lib_glsl);
@@ -260,7 +258,6 @@ static GPUShader *ensure_background_shader(WORKBENCH_PrivateData *wpd)
     const char *defines = (index) ? "#define V3D_SHADING_OBJECT_OUTLINE\n" : NULL;
     char *frag = BLI_string_joinN(datatoc_workbench_data_lib_glsl,
                                   datatoc_workbench_common_lib_glsl,
-                                  datatoc_workbench_background_lib_glsl,
                                   datatoc_workbench_object_outline_lib_glsl,
                                   datatoc_workbench_deferred_background_frag_glsl);
     e_data.background_sh[index] = DRW_shader_create_fullscreen(frag, defines);
@@ -717,8 +714,12 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
 
   /* Background Pass */
   {
-    psl->background_pass = DRW_pass_create("Background",
-                                           DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
+    DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
+    if (DRW_state_is_scene_render()) {
+      /* Composite the scene over cleared background. */
+      state |= DRW_STATE_BLEND_ALPHA_PREMUL;
+    }
+    psl->background_pass = DRW_pass_create("Background", state);
     grp = DRW_shgroup_create(wpd->background_sh, psl->background_pass);
     DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
     DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
@@ -1314,6 +1315,13 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
     DRW_draw_pass(psl->cavity_pass);
   }
 
+  if (DRW_state_is_scene_render()) {
+    float clear_color[4];
+    workbench_clear_color_get(clear_color);
+    GPU_framebuffer_bind(fbl->composite_fb);
+    GPU_framebuffer_clear_color(fbl->composite_fb, clear_color);
+  }
+
   if (SHADOW_ENABLED(wpd)) {
 #ifdef DEBUG_SHADOW_VOLUME
     GPU_framebuffer_bind(fbl->composite_fb);
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index a09d295a4c6..99df6cb8fed 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -72,7 +72,6 @@ extern char datatoc_workbench_forward_composite_frag_glsl[];
 extern char datatoc_workbench_forward_depth_frag_glsl[];
 extern char datatoc_workbench_forward_transparent_accum_frag_glsl[];
 extern char datatoc_workbench_data_lib_glsl[];
-extern char datatoc_workbench_background_lib_glsl[];
 extern char datatoc_workbench_checkerboard_depth_frag_glsl[];
 extern char datatoc_workbench_object_outline_lib_glsl[];
 extern char datatoc_workbench_curvature_lib_glsl[];
@@ -128,7 +127,6 @@ static char *workbench_build_forward_composite_frag(void)
 
   BLI_dynstr_append(ds, datatoc_workbench_data_lib_glsl);
   BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
-  BLI_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list