diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-05-01 17:21:53 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-05-01 17:32:55 +0300 |
commit | d7d4bca23be91ec5b0ce562d47a34ee49dd337b8 (patch) | |
tree | 6184684f5300324294dbaa103522e7e817e3d6bd /source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl | |
parent | 6ef497d401e5e7842d1e9d33e491672bb77d60e0 (diff) |
Reworked version of dashed line shader.
Using geometry shader allows us to get rid of the 'line origin' extra
vertex attribute, which means dashed shader no longer requires fiddling
with those vertex attributes definition, and, most importantly, does not
require anymore special drawing code!
As you can see, this makes code much simpler, and much less verbose,
especially in complex cases.
In addition, changed how dashes are handled, to have two 'modes', a
simple one with single color (using default "color" uniform name), and a
more advanced one allowing more complex and multi-color patterns.
Note that since GLSL 1.2 does not support geometry shaders, a hack was
added for now (which gives solid lines, but at least does not make
Blender crash).
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 | 38 |
1 files changed, 30 insertions, 8 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 index 85aab7e06ef..1bca505390b 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl @@ -1,6 +1,5 @@ // Draw dashed lines, perforated in screen space. -// Based on a (3D) version by Mike Erwin. #if __VERSION__ == 120 noperspective varying float distance_along_line; @@ -11,15 +10,38 @@ #endif uniform float dash_width; -uniform float dash_width_on; -uniform vec4 color1; -uniform vec4 color2; + +/* Simple mode, discarding non-dash parts (so no need for blending at all). */ +uniform float dash_factor; /* if > 1.0, solid line. */ +uniform vec4 color; + +/* 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]; void main() { - if (mod(distance_along_line, dash_width) <= dash_width_on) { - fragColor = color1; - } else { - fragColor = color2; + /* Solid line cases, simple. */ + if (num_colors == 1) { + fragColor = colors[0]; + } + else if (dash_factor >= 1.0f) { + fragColor = color; + } + else { + /* Actually dashed line... */ + float normalized_distance = fract(distance_along_line / dash_width); + if (num_colors > 0) { + fragColor = colors[int(normalized_distance * num_colors)]; + } + else { + if (normalized_distance <= dash_factor) { + fragColor = color; + } + else { + discard; + } + } } } |