[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