[Bf-blender-cvs] [37cd7b25dc8] master: Overlay: Wireframe: Fix Edges not being culled correctly

Clément Foucault noreply at git.blender.org
Tue Dec 3 01:08:01 CET 2019


Commit: 37cd7b25dc87d53ee68dde3c9cf0809e200a26fd
Author: Clément Foucault
Date:   Tue Dec 3 01:06:40 2019 +0100
Branches: master
https://developer.blender.org/rB37cd7b25dc87d53ee68dde3c9cf0809e200a26fd

Overlay: Wireframe: Fix Edges not being culled correctly

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

M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl
M	source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index bf58f763746..3f702a00bcd 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -1215,7 +1215,7 @@ GPUShader *OVERLAY_shader_wireframe_select(void)
                                  datatoc_gpu_shader_common_obinfos_lib_glsl,
                                  datatoc_wireframe_vert_glsl,
                                  NULL},
-        .frag = (const char *[]){datatoc_gpu_shader_depth_only_frag_glsl, NULL},
+        .frag = (const char *[]){datatoc_wireframe_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg->def, "#define SELECT_EDGES\n", NULL},
     });
   }
diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl
index 0c6a3a651b9..edfe720da0c 100644
--- a/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl
@@ -1,14 +1,25 @@
 
-in vec3 finalColor;
 flat in vec2 edgeStart;
+
+#ifndef SELECT_EDGES
+in vec3 finalColor;
 noperspective in vec2 edgePos;
 
 layout(location = 0) out vec4 fragColor;
 layout(location = 1) out vec4 lineOutput;
+#endif
 
 void main()
 {
+  /* Needed only because of wireframe slider.
+   * If we could get rid of it would be nice because of performance drain of discard. */
+  if (edgeStart.r == -1.0) {
+    discard;
+  }
+
+#ifndef SELECT_EDGES
   lineOutput = pack_line_data(gl_FragCoord.xy, edgeStart, edgePos);
   fragColor.rgb = finalColor;
   fragColor.a = 1.0;
+#endif
 }
diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
index c627e912d6c..16fdf2687fa 100644
--- a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
@@ -9,9 +9,10 @@ in vec3 pos;
 in vec3 nor;
 in float wd; /* wiredata */
 
+flat out vec2 edgeStart;
+
 #ifndef SELECT_EDGES
 out vec3 finalColor;
-flat out vec2 edgeStart;
 noperspective out vec2 edgePos;
 #endif
 
@@ -103,14 +104,12 @@ void main()
   vec3 wpos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(wpos);
 
-  if (get_edge_sharpness(wd) < 0.0) {
-    /* Discard primitive by placing any of the verts at the camera origin. */
-    gl_Position = vec4(0.0, 0.0, -3e36, 0.0);
-  }
 
-#ifndef SELECT_EDGES
   /* Convert to screen position [0..sizeVp]. */
-  edgePos = edgeStart = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy;
+  edgeStart = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy;
+
+#ifndef SELECT_EDGES
+  edgePos = edgeStart;
 
   vec3 rim_col, wire_col;
   if (isObjectColor || isRandomColor) {
@@ -129,6 +128,11 @@ void main()
   finalColor = mix(final_rim_col, final_front_col, facing);
 #endif
 
+  /* Cull flat edges below threshold. */
+  if (get_edge_sharpness(wd) < 0.0) {
+    edgeStart = vec2(-1.0);
+  }
+
 #ifdef USE_WORLD_CLIP_PLANES
   world_clip_planes_calc_clip_distance(wpos);
 #endif



More information about the Bf-blender-cvs mailing list