[Bf-blender-cvs] [42580ddf920] greasepencil-refactor: GPencil: Refactor: Use more correct depth merge approximation for 2D object

Clément Foucault noreply at git.blender.org
Sat Dec 21 01:21:51 CET 2019


Commit: 42580ddf92058d14e15bbf682876141a97e0b45e
Author: Clément Foucault
Date:   Sat Dec 21 01:21:07 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB42580ddf92058d14e15bbf682876141a97e0b45e

GPencil: Refactor: Use more correct depth merge approximation for 2D object

We now use a plane that follows the computed shading normal.
The plane follows the camera rotation but also takes the gpobject volume
into account.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/gpencil/gpencil_cache_utils.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/gpencil_shader.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_frag.glsl
A	source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 885213dccb4..8aa5949a052 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -282,6 +282,7 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_composite_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_layer_blend_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_layer_mask_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_depth_merge_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/gpencil_depth_merge_vert.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_vfx_frag.glsl SRC)
 
 data_to_c_simple(engines/gpencil/shaders/gpencil_fill_vert.glsl SRC)
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index ad67168dd25..5099db399d6 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -89,6 +89,17 @@ GPENCIL_tObject *gpencil_object_cache_add_new(GPENCIL_PrivateData *pd, Object *o
   mul_mat3_m4_v3(mat, tgp_ob->plane_normal);
   normalize_v3(tgp_ob->plane_normal);
 
+  /* Define a matrix that will be used to render a triangle to merge the depth of the rendered
+   * gpencil object with the rest of the scene. */
+  unit_m4(tgp_ob->plane_mat);
+  copy_v3_v3(tgp_ob->plane_mat[2], tgp_ob->plane_normal);
+  orthogonalize_m4(tgp_ob->plane_mat, 2);
+  mul_mat3_m4_v3(ob->obmat, size);
+  float radius = len_v3(size);
+  mul_m4_v3(ob->obmat, center);
+  rescale_m4(tgp_ob->plane_mat, (float[3]){radius, radius, radius});
+  copy_v3_v3(tgp_ob->plane_mat[3], center);
+
   BLI_LINKS_APPEND(&pd->tobjects, tgp_ob);
 
   return tgp_ob;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index c4ee154904d..184cb1e450e 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -332,6 +332,7 @@ static void GPENCIL_engine_init_new(void *ved)
   float viewmatinv[4][4];
   DRW_view_viewmat_get(NULL, viewmatinv, true);
   copy_v3_v3(stl->pd->camera_z_axis, viewmatinv[2]);
+  copy_v3_v3(stl->pd->camera_pos, viewmatinv[3]);
   stl->pd->camera_z_offset = dot_v3v3(viewmatinv[3], viewmatinv[2]);
 
   if (ctx && ctx->rv3d && ctx->v3d) {
@@ -465,8 +466,8 @@ static void GPENCIL_cache_init_new(void *ved)
     GPUShader *sh = GPENCIL_shader_depth_merge_get(&e_data);
     grp = DRW_shgroup_create(sh, psl->merge_depth_ps);
     DRW_shgroup_uniform_texture_ref(grp, "depthBuf", &pd->depth_tx);
-    DRW_shgroup_uniform_float(grp, "strokeDepth2d", &pd->object_depth, 1);
     DRW_shgroup_uniform_bool(grp, "strokeOrder3d", &pd->is_stroke_order_3d, 1);
+    DRW_shgroup_uniform_vec4(grp, "gpModelMatrix[0]", pd->object_bound_mat, 4);
     DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
   }
 
@@ -1471,7 +1472,7 @@ static void GPENCIL_draw_scene_new(void *ved)
       DRW_draw_pass(vfx->vfx_ps);
     }
 
-    pd->object_depth = ob->camera_z - pd->camera_z_offset;
+    copy_m4_m4(pd->object_bound_mat, ob->plane_mat);
     pd->is_stroke_order_3d = ob->is_drawmode3d;
 
     /* TODO fix for render */
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index bdf4b4db906..20a70aa2783 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -236,6 +236,8 @@ typedef struct GPENCIL_tObject {
   float camera_z;
   /* Normal used for shading. Based on view angle. */
   float plane_normal[3];
+  /* Used for drawing depth merge pass. */
+  float plane_mat[4][4];
 
   bool is_drawmode3d;
 } GPENCIL_tObject;
@@ -479,8 +481,8 @@ typedef struct GPENCIL_PrivateData {
   /* True in selection and auto_depth drawing */
   bool draw_depth_only;
   /* Used by the depth merge step. */
-  float object_depth;
   int is_stroke_order_3d;
+  float object_bound_mat[4][4];
   /* Used for computing object distance to camera. */
   float camera_z_axis[3], camera_z_offset;
   float camera_pos[3];
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader.c b/source/blender/draw/engines/gpencil/gpencil_shader.c
index 8445bd0dfd6..445e2652908 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader.c
@@ -30,6 +30,7 @@ extern char datatoc_gpencil_composite_frag_glsl[];
 extern char datatoc_gpencil_layer_blend_frag_glsl[];
 extern char datatoc_gpencil_layer_mask_frag_glsl[];
 extern char datatoc_gpencil_depth_merge_frag_glsl[];
+extern char datatoc_gpencil_depth_merge_vert_glsl[];
 extern char datatoc_gpencil_vfx_frag_glsl[];
 
 extern char datatoc_common_colormanagement_lib_glsl[];
@@ -108,12 +109,12 @@ struct GPUShader *GPENCIL_shader_depth_merge_get(GPENCIL_e_data *e_data)
     e_data->depth_merge_sh = GPU_shader_create_from_arrays({
         .vert =
             (const char *[]){
-                datatoc_common_fullscreen_vert_glsl,
+                datatoc_common_view_lib_glsl,
+                datatoc_gpencil_depth_merge_vert_glsl,
                 NULL,
             },
         .frag =
             (const char *[]){
-                datatoc_common_view_lib_glsl,
                 datatoc_gpencil_depth_merge_frag_glsl,
                 NULL,
             },
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_frag.glsl
index 6169e69c292..71597197bd8 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_frag.glsl
@@ -3,17 +3,15 @@ uniform sampler2D depthBuf;
 uniform float strokeDepth2d;
 uniform bool strokeOrder3d;
 
-in vec4 uvcoordsvar;
+noperspective in vec4 uvcoordsvar;
 
 void main()
 {
   float depth = textureLod(depthBuf, uvcoordsvar.xy, 0).r;
-
   if (strokeOrder3d) {
     gl_FragDepth = depth;
   }
   else {
-    vec4 p = ProjectionMatrix * vec4(0.0, 0.0, strokeDepth2d, 1.0);
-    gl_FragDepth = (depth != 0) ? ((p.z / p.w) * 0.5 + 0.5) : 1.0;
+    gl_FragDepth = (depth != 0.0) ? gl_FragCoord.z : 1.0;
   }
 }
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_vert.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_vert.glsl
new file mode 100644
index 00000000000..1e5a900f486
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_depth_merge_vert.glsl
@@ -0,0 +1,14 @@
+
+uniform vec4 gpModelMatrix[4];
+
+noperspective out vec4 uvcoordsvar;
+
+void main()
+{
+  mat4 model_matrix = mat4(gpModelMatrix[0], gpModelMatrix[1], gpModelMatrix[2], gpModelMatrix[3]);
+  int v = gl_VertexID % 3;
+  float x = -1.0 + float((v & 1) << 2);
+  float y = -1.0 + float((v & 2) << 1);
+  gl_Position = ViewProjectionMatrix * (model_matrix * vec4(x, y, 0.0, 1.0));
+  uvcoordsvar = vec4((gl_Position.xy / gl_Position.w + 1.0) * 0.5, 0.0, 0.0);
+}



More information about the Bf-blender-cvs mailing list