From 17293056d58e7a184df82753f5092507a74618f5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 5 Apr 2022 12:14:01 +0200 Subject: [PATCH] Refactoring in shader dashed_thick_lines --- resources/shaders/140/dashed_thick_lines.fs | 13 ++++---- resources/shaders/140/dashed_thick_lines.gs | 37 ++++++++------------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/resources/shaders/140/dashed_thick_lines.fs b/resources/shaders/140/dashed_thick_lines.fs index 1555c63e9..4f6c75a2f 100644 --- a/resources/shaders/140/dashed_thick_lines.fs +++ b/resources/shaders/140/dashed_thick_lines.fs @@ -3,21 +3,20 @@ // see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h // https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 -const vec2 aa_radius = vec2(0.5); +const float aa_radius = 0.5; uniform float dash_size; uniform float gap_size; uniform vec4 uniform_color; in float line_width; -in float line_length; -in vec3 uvs; +in vec2 seg_params; out vec4 out_color; void main() { - if (gap_size > 0.0 && fract(uvs.z / (dash_size + gap_size)) > dash_size / (dash_size + gap_size)) + if (gap_size > 0.0 && fract(seg_params.y / (dash_size + gap_size)) > dash_size / (dash_size + gap_size)) discard; // We render a quad that is fattened by r, giving total width of the line to be w+r. We want smoothing to happen @@ -27,7 +26,7 @@ void main() // This way the smoothing is centered around 'w'. out_color = uniform_color; - float au = 1.0 - smoothstep(1.0 - (2.0 * aa_radius[0] / line_width), 1.0, abs(uvs.x / line_width)); - float av = 1.0 - smoothstep(1.0 - (2.0 * aa_radius[1] / line_length), 1.0, abs(uvs.y / line_length)); - out_color.a *= min(av, au); + float inv_line_width = 1.0 / line_width; + float au = 1.0 - smoothstep(1.0 - (2.0 * aa_radius * inv_line_width), 1.0, abs(seg_params.x * inv_line_width)); + out_color.a *= au; } diff --git a/resources/shaders/140/dashed_thick_lines.gs b/resources/shaders/140/dashed_thick_lines.gs index 84d8fb63f..5f54f40be 100644 --- a/resources/shaders/140/dashed_thick_lines.gs +++ b/resources/shaders/140/dashed_thick_lines.gs @@ -6,7 +6,7 @@ layout(lines) in; layout(triangle_strip, max_vertices = 4) out; -const vec2 aa_radius = vec2(0.5); +const float aa_radius = 0.5; uniform vec2 viewport_size; uniform float width; @@ -14,44 +14,35 @@ uniform float width; in float coord_s[]; out float line_width; -out float line_length; -out vec3 uvs; +out vec2 seg_params; void main() { - float u_width = viewport_size[0]; - float u_height = viewport_size[1]; - vec2 ndc_0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; vec2 ndc_1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; - vec2 viewport_line_vector = 0.5 * (ndc_1 - ndc_0) * viewport_size; - vec2 dir = normalize(viewport_line_vector); + vec2 dir = normalize((ndc_1 - ndc_0) * viewport_size); vec2 normal_dir = vec2(-dir.y, dir.x); - line_width = max(1.0, width) + 2.0 * aa_radius[0]; - line_length = length(viewport_line_vector) + 2.0 * aa_radius[1]; - - vec2 normal = vec2(line_width / u_width, line_width / u_height) * normal_dir; - vec2 extension = vec2(aa_radius[1] / u_width, aa_radius[1] / u_height) * dir; - + line_width = max(1.0, width) + 2.0 * aa_radius; float half_line_width = 0.5 * line_width; - float half_line_length = 0.5 * line_length; + + vec2 normal = vec2(line_width / viewport_size[0], line_width / viewport_size[1]) * normal_dir; - uvs = vec3(-half_line_width, half_line_length, coord_s[0]); - gl_Position = vec4((ndc_0 + normal - extension) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 + normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); EmitVertex(); - uvs = vec3(-half_line_width, -half_line_length, coord_s[0]); - gl_Position = vec4((ndc_0 - normal - extension) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 - normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); EmitVertex(); - uvs = vec3(half_line_width, half_line_length, coord_s[1]); - gl_Position = vec4((ndc_1 + normal + extension) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 + normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); EmitVertex(); - uvs = vec3(half_line_width, -half_line_length, coord_s[1]); - gl_Position = vec4((ndc_1 - normal + extension) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 - normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); EmitVertex(); EndPrimitive();