[Bf-blender-cvs] [d40579c62b4] master: Overlay Engine: Fix bone outline antialiasing

Clément Foucault noreply at git.blender.org
Thu Dec 5 16:36:46 CET 2019


Commit: d40579c62b40e2ad7d30ae4196169c3328610d41
Author: Clément Foucault
Date:   Thu Dec 5 16:08:52 2019 +0100
Branches: master
https://developer.blender.org/rBd40579c62b40e2ad7d30ae4196169c3328610d41

Overlay Engine: Fix bone outline antialiasing

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_armature.c
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
M	source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
M	source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
M	source/blender/draw/engines/overlay/shaders/armature_sphere_outline_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_wire_frag.glsl
M	source/blender/draw/engines/overlay/shaders/armature_wire_vert.glsl
M	source/blender/draw/intern/draw_cache.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 931d8c058ce..eea34f98189 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -322,6 +322,7 @@ data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_stick_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_stick_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_wire_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 556cab39b30..4749901470f 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -204,12 +204,6 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
       DRW_shgroup_uniform_float_copy(grp, "alpha", pd->armature.transparent ? 0.4f : 1.0f);
       cb->point_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get());
 
-      sh = OVERLAY_shader_armature_sphere(true);
-      grp = DRW_shgroup_create(sh, armature_ps);
-      DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
-      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
-      cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
-
       sh = OVERLAY_shader_armature_shape(false);
       cb->custom_solid = grp = DRW_shgroup_create(sh, armature_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
@@ -217,9 +211,15 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
       cb->box_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get());
       cb->octa_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get());
 
+      sh = OVERLAY_shader_armature_sphere(true);
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+      cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
+
       sh = OVERLAY_shader_armature_shape(true);
       cb->custom_outline = grp = DRW_shgroup_create(sh, armature_ps);
-      DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+      DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       cb->box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get());
       cb->octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get());
@@ -230,6 +230,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
       sh = OVERLAY_shader_armature_degrees_of_freedom();
       grp = DRW_shgroup_create(sh, armature_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+      DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
       cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
 
       grp = DRW_shgroup_create(sh, psl->armature_transp_ps);
@@ -258,7 +259,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
 
       sh = OVERLAY_shader_armature_envelope(true);
       grp = DRW_shgroup_create(sh, armature_ps);
-      DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+      DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       cb->envelope_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_outline_get());
 
@@ -276,6 +277,8 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
 
       sh = OVERLAY_shader_armature_wire();
       grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
       cb->wire = BUF_LINE(grp, format);
     }
   }
@@ -2341,12 +2344,9 @@ void OVERLAY_pose_draw(OVERLAY_Data *vedata)
     DRW_draw_pass(psl->armature_bone_select_ps);
 
     if (DRW_state_is_fbo()) {
-      GPU_framebuffer_bind(fbl->overlay_line_in_front_fb);
-      GPU_framebuffer_clear_depth(fbl->overlay_line_in_front_fb, 1.0f);
+      GPU_framebuffer_bind(fbl->overlay_line_fb);
     }
 
-    /* Selection still works because we are drawing only the pose bones in this case. */
-
     DRW_draw_pass(psl->armature_ps[1]);
   }
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index be55d6c07c7..7ef8ca88e19 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -44,6 +44,7 @@ extern char datatoc_armature_sphere_solid_frag_glsl[];
 extern char datatoc_armature_sphere_solid_vert_glsl[];
 extern char datatoc_armature_stick_frag_glsl[];
 extern char datatoc_armature_stick_vert_glsl[];
+extern char datatoc_armature_wire_frag_glsl[];
 extern char datatoc_armature_wire_vert_glsl[];
 extern char datatoc_depth_only_vert_glsl[];
 extern char datatoc_edit_curve_handle_geom_glsl[];
@@ -296,7 +297,7 @@ GPUShader *OVERLAY_shader_armature_sphere(bool use_outline)
                                  NULL},
         .frag = (const char *[]){extensions,
                                  datatoc_common_view_lib_glsl,
-                                 datatoc_gpu_shader_flat_color_frag_glsl,
+                                 datatoc_armature_wire_frag_glsl,
                                  NULL},
         .defs = (const char *[]){sh_cfg->def, NULL},
     });
@@ -334,7 +335,8 @@ GPUShader *OVERLAY_shader_armature_shape(bool use_outline)
                                  datatoc_common_view_lib_glsl,
                                  datatoc_armature_shape_outline_geom_glsl,
                                  NULL},
-        .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+        .frag =
+            (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg->def, NULL},
     });
   }
@@ -363,7 +365,8 @@ GPUShader *OVERLAY_shader_armature_envelope(bool use_outline)
                                  datatoc_common_view_lib_glsl,
                                  datatoc_armature_envelope_outline_vert_glsl,
                                  NULL},
-        .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+        .frag =
+            (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg->def, NULL},
     });
   }
@@ -407,10 +410,12 @@ GPUShader *OVERLAY_shader_armature_degrees_of_freedom(void)
   if (!sh_data->armature_dof) {
     sh_data->armature_dof = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg->lib,
+                                 datatoc_common_globals_lib_glsl,
                                  datatoc_common_view_lib_glsl,
                                  datatoc_armature_dof_vert_glsl,
                                  NULL},
-        .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+        .frag =
+            (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg->def, NULL},
     });
   }
@@ -425,10 +430,12 @@ GPUShader *OVERLAY_shader_armature_wire(void)
   if (!sh_data->armature_wire) {
     sh_data->armature_wire = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg->lib,
+                                 datatoc_common_globals_lib_glsl,
                                  datatoc_common_view_lib_glsl,
                                  datatoc_armature_wire_vert_glsl,
                                  NULL},
-        .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+        .frag =
+            (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg->def, NULL},
     });
   }
diff --git a/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
index 371229f23ab..b15554bbb6a 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
@@ -8,6 +8,8 @@ in vec4 color;
 in mat4 inst_obmat;
 
 flat out vec4 finalColor;
+flat out vec2 edgeStart;
+noperspective out vec2 edgePos;
 
 vec3 sphere_project(float ax, float az)
 {
@@ -28,6 +30,14 @@ void main()
 
   vec3 final_pos = sphere_project(pos.x * abs((pos.x > 0.0) ? amax.x : amin.x),
                                   pos.y * abs((pos.y > 0.0) ? amax.y : amin.y));
-  gl_Position = ViewProjectionMatrix * (model_mat * vec4(final_pos, 1.0));
+
+  vec3 world_pos = (model_mat * vec4(final_pos, 1.0)).xyz;
+  gl_Position = point_world_to_ndc(world_pos);
   finalColor = color;
+
+  edgeStart = edgePos = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy;
+
+#ifdef USE_WORLD_CLIP_PLANES
+  world_clip_planes_calc_clip_distance(world_pos);
+#endif
 }
diff --git a/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
index e3cc8d582d8..2260b2d3fa6 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
@@ -12,6 +12,8 @@ in vec4 outlineColorSize;
 in vec3 xAxis;
 
 flat out vec4 finalColor;
+flat out vec2 edgeStart;
+noperspective out vec2 edgePos;
 
 /* project to screen space */
 vec2 proj(vec4 pos)
@@ -132,33 +134,27 @@ void main()
   vec3 wpos2 =

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list