From 3e241af3aec2bf03b0b558ca419ceb08d394a239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 2 Dec 2019 13:55:30 +0100 Subject: Overlay Engine: Wireframe: Remove geometry shader and fragment discard This Simplify and should also speedup the drawing a tiny bit. We now discard the edges in the vertex shader by setting one of the verts at vec4(0,0,0,0) to not produce any fragment --- source/blender/draw/CMakeLists.txt | 1 - .../blender/draw/engines/overlay/overlay_shader.c | 30 +++-------- .../engines/overlay/shaders/wireframe_frag.glsl | 6 --- .../engines/overlay/shaders/wireframe_geom.glsl | 61 ---------------------- .../engines/overlay/shaders/wireframe_vert.glsl | 45 +++++++--------- 5 files changed, 26 insertions(+), 117 deletions(-) delete mode 100644 source/blender/draw/engines/overlay/shaders/wireframe_geom.glsl (limited to 'source/blender/draw') diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 7d996f3c535..ea52d8e8f1f 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -380,7 +380,6 @@ data_to_c_simple(engines/overlay/shaders/particle_frag.glsl SRC) data_to_c_simple(engines/overlay/shaders/sculpt_mask_vert.glsl SRC) data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC) data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC) -data_to_c_simple(engines/overlay/shaders/wireframe_geom.glsl SRC) data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC) list(APPEND INC diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index fa495d153e9..bf58f763746 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -100,7 +100,6 @@ extern char datatoc_particle_frag_glsl[]; extern char datatoc_sculpt_mask_vert_glsl[]; extern char datatoc_volume_velocity_vert_glsl[]; extern char datatoc_wireframe_vert_glsl[]; -extern char datatoc_wireframe_geom_glsl[]; extern char datatoc_wireframe_frag_glsl[]; extern char datatoc_gpu_shader_depth_only_frag_glsl[]; @@ -1216,10 +1215,6 @@ GPUShader *OVERLAY_shader_wireframe_select(void) datatoc_gpu_shader_common_obinfos_lib_glsl, datatoc_wireframe_vert_glsl, NULL}, - .geom = (const char *[]){sh_cfg->lib, - datatoc_common_globals_lib_glsl, - datatoc_wireframe_geom_glsl, - NULL}, .frag = (const char *[]){datatoc_gpu_shader_depth_only_frag_glsl, NULL}, .defs = (const char *[]){sh_cfg->def, "#define SELECT_EDGES\n", NULL}, }); @@ -1234,23 +1229,14 @@ GPUShader *OVERLAY_shader_wireframe(void) OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; if (!sh_data->wireframe) { sh_data->wireframe = GPU_shader_create_from_arrays({ - .vert = (const char *[]){sh_cfg->lib, - datatoc_common_view_lib_glsl, - datatoc_common_globals_lib_glsl, - datatoc_gpu_shader_common_obinfos_lib_glsl, - datatoc_wireframe_vert_glsl, - NULL}, - .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_wireframe_frag_glsl, NULL}, - /* Apple drivers does not support wide wires. Use geometry shader as a workaround. */ -#if USE_GEOM_SHADER_WORKAROUND - .geom = (const char *[]){sh_cfg->lib, - datatoc_common_globals_lib_glsl, - datatoc_wireframe_geom_glsl, - NULL}, - .defs = (const char *[]){sh_cfg->def, "#define USE_GEOM\n", NULL}, -#else - .defs = (const char *[]){sh_cfg->def, NULL}, -#endif + .vert = (const char *[]){sh_cfg->lib, + datatoc_common_view_lib_glsl, + datatoc_common_globals_lib_glsl, + datatoc_gpu_shader_common_obinfos_lib_glsl, + datatoc_wireframe_vert_glsl, + NULL}, + .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_wireframe_frag_glsl, NULL}, + .defs = (const char *[]){sh_cfg->def, NULL}, }); } return sh_data->wireframe; diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl index 39d0012574c..0c6a3a651b9 100644 --- a/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl @@ -1,7 +1,5 @@ in vec3 finalColor; -flat in float edgeSharpness; - flat in vec2 edgeStart; noperspective in vec2 edgePos; @@ -10,10 +8,6 @@ layout(location = 1) out vec4 lineOutput; void main() { - if (edgeSharpness < 0.0) { - discard; - } - lineOutput = pack_line_data(gl_FragCoord.xy, edgeStart, edgePos); fragColor.rgb = finalColor; fragColor.a = 1.0; diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_geom.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_geom.glsl deleted file mode 100644 index 346c9d83a9e..00000000000 --- a/source/blender/draw/engines/overlay/shaders/wireframe_geom.glsl +++ /dev/null @@ -1,61 +0,0 @@ - -/* This shader is only used for edge selection and OSX workaround for large wires. */ - -layout(lines) in; -layout(triangle_strip, max_vertices = 4) out; - -in vec3 finalColor_g[]; -in float edgeSharpness_g[]; - -#ifndef SELECT_EDGES -out vec3 finalColor; -flat out float edgeSharpness; - -flat out vec2 edgeStart; -noperspective out vec2 edgePos; -#endif - -void do_vertex(const int i, float coord, vec2 offset) -{ -#ifndef SELECT_EDGES - /* TODO */ - edgePos = edgeStart = vec2(0); - edgeSharpness = edgeSharpness_g[i]; - finalColor = finalColor_g[i]; -#endif - gl_Position = gl_in[i].gl_Position; - /* Multiply offset by 2 because gl_Position range is [-1..1]. */ - gl_Position.xy += offset * 2.0 * gl_Position.w; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance); -#endif - EmitVertex(); -} - -void main() -{ - vec2 ss_pos[2]; - ss_pos[0] = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; - ss_pos[1] = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; - - vec2 line = ss_pos[0] - ss_pos[1]; - line = abs(line) * sizeViewport.xy; - - float half_size = sizePixel * 0.5; - - vec3 edge_ofs = vec3(half_size * sizeViewportInv.xy, 0.0); - - bool horizontal = line.x > line.y; - edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz; - - if (edgeSharpness_g[0] < 0.0) { - return; - } - - do_vertex(0, half_size, edge_ofs.xy); - do_vertex(0, -half_size, -edge_ofs.xy); - do_vertex(1, half_size, edge_ofs.xy); - do_vertex(1, -half_size, -edge_ofs.xy); - - EndPrimitive(); -} diff --git a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl index 78ce8fd8a8f..5801c7cb474 100644 --- a/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl @@ -1,37 +1,25 @@ uniform float wireStepParam; +uniform bool useColoring; +uniform bool isTransform; +uniform bool isObjectColor; +uniform bool isRandomColor; in vec3 pos; in vec3 nor; in float wd; /* wiredata */ +#ifndef SELECT_EDGES +out vec3 finalColor; +flat out vec2 edgeStart; +noperspective out vec2 edgePos; +#endif + float get_edge_sharpness(float wd) { return ((wd == 0.0) ? -1.5 : wd) + wireStepParam; } -/* Geometry shader version */ -#if defined(SELECT_EDGES) || defined(USE_GEOM) -out vec3 finalColor_g; -out float edgeSharpness_g; - -#else /* USE_GEOM */ - -flat out vec2 edgeStart; -noperspective out vec2 edgePos; - -out vec3 finalColor; -flat out float edgeSharpness; -# define finalColor_g finalColor -# define edgeSharpness_g edgeSharpness - -#endif /* SELECT_EDGES */ - -uniform bool useColoring; -uniform bool isTransform; -uniform bool isObjectColor; -uniform bool isRandomColor; - void wire_color_get(out vec3 rim_col, out vec3 wire_col) { int flag = int(abs(ObjectInfo.w)); @@ -115,12 +103,14 @@ void main() vec3 wpos = point_object_to_world(pos); gl_Position = point_world_to_ndc(wpos); -#if !(defined(SELECT_EDGES) || defined(USE_GEOM)) + if (get_edge_sharpness(wd) < 0.0) { + /* Discard primitive. */ + gl_Position = vec4(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; -#endif - - edgeSharpness_g = get_edge_sharpness(wd); vec3 rim_col, wire_col; if (isObjectColor || isRandomColor) { @@ -136,7 +126,8 @@ void main() vec3 final_front_col = mix(rim_col, wire_col, 0.4); vec3 final_rim_col = mix(rim_col, wire_col, 0.1); - finalColor_g = mix(final_rim_col, final_front_col, facing); + finalColor = mix(final_rim_col, final_front_col, facing); +#endif #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_calc_clip_distance(wpos); -- cgit v1.2.3