diff options
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl new file mode 100644 index 00000000000..7caf00f58fd --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl @@ -0,0 +1,54 @@ + +/* + * Fragment Shader for dashed lines, with uniform multi-color(s), or any single-color, and any thickness. + * + * Dashed is performed in screen space. + */ + +uniform float dash_width; + +/* Simple mode, discarding non-dash parts (so no need for blending at all). */ +uniform float dash_factor; /* if > 1.0, solid line. */ + +/* More advanced mode, allowing for complex, multi-colored patterns. Enabled when num_colors > 0. */ +/* Note: max number of steps/colors in pattern is 32! */ +uniform int num_colors; /* Enabled if > 0, 1 for solid line. */ +uniform vec4 colors[32]; + +noperspective in float distance_along_line; +noperspective in vec4 color_geom; + +out vec4 fragColor; + +void main() +{ + /* Multi-color option. */ + if (num_colors > 0) { + /* Solid line case, simple. */ + if (num_colors == 1) { + fragColor = colors[0]; + } + /* Actually dashed line... */ + else { + float normalized_distance = fract(distance_along_line / dash_width); + fragColor = colors[int(normalized_distance * num_colors)]; + } + } + /* Single color option. */ + else { + /* Solid line case, simple. */ + if (dash_factor >= 1.0f) { + fragColor = color_geom; + } + /* Actually dashed line... */ + else { + float normalized_distance = fract(distance_along_line / dash_width); + if (normalized_distance <= dash_factor) { + fragColor = color_geom; + } + else { + discard; + } + } + } +} |