[Bf-blender-cvs] [62a7ac8f17e] tmp-workbench-rewrite: Workbench: Refactor: Add Infront support

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:36:01 CET 2020


Commit: 62a7ac8f17ee8bf576f4d8db4a901598d2e64c74
Author: Clément Foucault
Date:   Sun Mar 1 14:26:56 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB62a7ac8f17ee8bf576f4d8db4a901598d2e64c74

Workbench: Refactor: Add Infront support

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
A	source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/engines/workbench/workbench_transparent.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 54db2655de2..3ce2681072f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -265,6 +265,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC
 data_to_c_simple(engines/workbench/shaders/workbench_image_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_matcap_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_merge_infront_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index a8d2c4c6cf0..cc8bd0e51ba 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -373,9 +373,6 @@ static void OVERLAY_cache_finish(void *vedata)
 
     DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
 
-    GPU_framebuffer_ensure_config(
-        &dfbl->default_fb,
-        {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
     GPU_framebuffer_ensure_config(
         &dfbl->in_front_fb,
         {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
new file mode 100644
index 00000000000..58becb03290
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
@@ -0,0 +1,18 @@
+
+uniform sampler2D depthBuffer;
+
+in vec4 uvcoordsvar;
+
+out vec4 fragColor;
+
+void main()
+{
+  float depth = texture(depthBuffer, uvcoordsvar.st).r;
+  /* Discard background pixels. */
+  if (depth == 1.0) {
+    discard;
+  }
+  /* Make this fragment occlude any fragment that will try to
+   * render over it in the normal passes. */
+  gl_FragDepth = 0.0;
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 762eeced176..f1528c2213c 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -508,7 +508,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
           size[0], size[1], GPU_R16, &draw_engine_workbench_solid);
     }
 
-    GPU_framebuffer_ensure_config(&fbl->prepass_fb,
+    GPU_framebuffer_ensure_config(&fbl->opaque_fb,
                                   {
                                       GPU_ATTACHMENT_TEXTURE(dtxl->depth),
                                       GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
@@ -1286,8 +1286,8 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
     GPU_framebuffer_clear_color(fbl->id_clear_fb, clear_col);
   }
 
-  GPU_framebuffer_bind(fbl->prepass_fb);
-  GPU_framebuffer_clear(fbl->prepass_fb, clear_bits, clear_col, clear_depth, clear_stencil);
+  GPU_framebuffer_bind(fbl->opaque_fb);
+  GPU_framebuffer_clear(fbl->opaque_fb, clear_bits, clear_col, clear_depth, clear_stencil);
 
   DRW_draw_pass(psl->prepass_pass);
   DRW_draw_pass(psl->prepass_hair_pass);
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 0879e5d98b4..25ede8e627b 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -268,6 +268,19 @@ static void workbench_cache_finish(void *ved)
   WORKBENCH_StorageList *stl = vedata->stl;
   WORKBENCH_PrivateData *wpd = stl->wpd;
 
+  /* TODO(fclem) Only do this when really needed. */
+  {
+    /* HACK we allocate the infront depth here to avoid the overhead when if is not needed. */
+    DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+    DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
+
+    GPU_framebuffer_ensure_config(
+        &dfbl->in_front_fb,
+        {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+  }
+
   workbench_update_material_ubos(wpd);
 
   if (wpd->material_hash) {
@@ -285,24 +298,27 @@ static void workbench_draw_scene(void *ved)
   float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
   float clear_col_with_alpha[4] = {0.0f, 0.0f, 0.0f, 1.0f};
 
+  {
+    GPU_framebuffer_bind(dfbl->in_front_fb);
+    GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
+  }
+
   GPU_framebuffer_bind(dfbl->color_only_fb);
   GPU_framebuffer_clear_color(dfbl->color_only_fb, clear_col);
 
   {
-    GPU_framebuffer_bind(fbl->prepass_fb);
-    DRW_draw_pass(psl->prepass_pass);
+    GPU_framebuffer_bind(fbl->opaque_fb);
+    DRW_draw_pass(psl->opaque_pass);
 
     /* TODO(fclem) shadows */
     // DRW_draw_pass(psl->shadow_pass);
 
     {
-      /* TODO(fclem) infront */
-      // GPU_framebuffer_bind(fbl->prepass_infront_fb);
-      // DRW_draw_pass(psl->prepass_infront_pass);
+      GPU_framebuffer_bind(fbl->opaque_infront_fb);
+      DRW_draw_pass(psl->opaque_infront_pass);
 
-      /* TODO(fclem) merge infront depth & stencil. */
-      // GPU_framebuffer_bind(fbl->prepass_fb);
-      // DRW_draw_pass(psl->merge_infront_pass);
+      GPU_framebuffer_bind(fbl->opaque_fb);
+      DRW_draw_pass(psl->merge_infront_pass);
     }
 
     GPU_framebuffer_bind(dfbl->default_fb);
@@ -322,14 +338,18 @@ static void workbench_draw_scene(void *ved)
 
     DRW_draw_pass(psl->transp_accum_pass);
 
-    {
-      /* TODO(fclem) infront */
-      // GPU_framebuffer_bind(fbl->tranp_accum_infront_fb);
-      // DRW_draw_pass(psl->transp_accum_infront_pass);
-    }
-
     GPU_framebuffer_bind(dfbl->color_only_fb);
     DRW_draw_pass(psl->transp_resolve_pass);
+
+    {
+      GPU_framebuffer_bind(fbl->transp_accum_infront_fb);
+      GPU_framebuffer_clear_color(fbl->transp_accum_infront_fb, clear_col_with_alpha);
+
+      DRW_draw_pass(psl->transp_accum_infront_pass);
+
+      GPU_framebuffer_bind(dfbl->color_only_fb);
+      DRW_draw_pass(psl->transp_resolve_pass);
+    }
   }
 
   /* TODO(fclem) outline */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index e93ee59f85f..f358e3028dd 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -474,6 +474,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
   Image *ima = NULL;
   ImageUser *iuser = NULL;
   int interp;
+  const bool infront = (ob->dtx & OB_DRAWXRAY) != 0;
 
   if (color_type == V3D_SHADING_TEXTURE_COLOR) {
     workbench_material_get_image(ob, mat_nr, &ima, &iuser, &interp);
@@ -507,7 +508,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
       workbench_material_ubo_data(wpd, ob, ma, &wpd->material_ubo_data_curr[id], color_type);
 
       const bool transp = wpd->shading.xray_alpha < 1.0f || ma->a < 1.0f;
-      DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp;
+      DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp;
       *grp_mat = grp = DRW_shgroup_create_sub(grp);
       DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
       DRW_shgroup_uniform_int_copy(grp, "materialIndex", id & 0xFFFu);
@@ -515,7 +516,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
     }
     case V3D_SHADING_VERTEX_COLOR: {
       const bool transp = wpd->shading.xray_alpha < 1.0f;
-      DRWShadingGroup *grp = wpd->prepass[transp].vcol_shgrp;
+      DRWShadingGroup *grp = wpd->prepass[transp][infront].vcol_shgrp;
       return grp;
     }
     default: {
@@ -530,7 +531,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
       workbench_material_ubo_data(wpd, ob, NULL, &wpd->material_ubo_data_curr[id], color_type);
 
       const bool transp = wpd->shading.xray_alpha < 1.0f || ob->color[3] < 1.0f;
-      DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp;
+      DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp;
       if (resource_changed) {
         grp = DRW_shgroup_create_sub(grp);
         DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
@@ -570,9 +571,10 @@ DRWShadingGroup *workbench_image_setup(
     return *grp_tex;
   }
 
+  const bool infront = (ob->dtx & OB_DRAWXRAY) != 0;
   const bool transp = wpd->shading.xray_alpha < 1.0f;
-  DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp].image_tiled_shgrp :
-                                           wpd->prepass[transp].image_shgrp;
+  DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp][infront].image_tiled_shgrp :
+                                           wpd->prepass[transp][infront].image_shgrp;
 
   *grp_tex = grp = DRW_shgroup_create_sub(grp);
   if (tex_tile_data) {
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index 0f1b91ce015..7ab11631f0b 100644
--- a/source/blender/draw/engines/workbench/workbench_opaque.c
+++ b/source/blender/draw/engines/workbench/workbench_opaque.c
@@ -45,13 +45,21 @@ void workbench_opaque_engine_init(WORKBENCH_Data *data)
     wpd->object_id_tx = DRW_texture_pool_query_fullscreen(id_tex_format, owner);
   }
 
-  GPU_framebuffer_ensure_config(&fbl->prepass_fb,
+  GPU_framebuffer_ensure_config(&fbl->opaque_fb,
                                 {
                                     GPU_ATTACHMENT_TEXTURE(dtxl->depth),
                                     GPU_ATTACHMENT_TEXTURE(wpd->material_buffer_tx),
                                     GPU_ATTACHMENT_TEXTURE(wpd->normal_bu

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list