From 40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 29 Sep 2022 10:52:58 -0700 Subject: Adds linear gradient support to 2D meshes in the canvas widget. --- glow/src/shader/common/gradient.frag | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 glow/src/shader/common/gradient.frag (limited to 'glow/src/shader/common/gradient.frag') diff --git a/glow/src/shader/common/gradient.frag b/glow/src/shader/common/gradient.frag new file mode 100644 index 00000000..588f63e0 --- /dev/null +++ b/glow/src/shader/common/gradient.frag @@ -0,0 +1,48 @@ +// GLSL does not support dynamically sized arrays without SSBOs +#define MAX_STOPS 64 + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#endif + +#ifdef HIGHER_THAN_300 +layout (location = 0) out vec4 fragColor; +#define gl_FragColor fragColor +#endif + +in vec2 raw_position; + +uniform vec2 gradient_start; +uniform vec2 gradient_end; + +uniform uint color_stops_size; +uniform float color_stop_offsets[MAX_STOPS]; +uniform vec4 color_stop_colors[MAX_STOPS]; + +void main() { + vec2 gradient_vec = vec2(gradient_end - gradient_start); + vec2 current_vec = vec2(raw_position.xy - gradient_start); + vec2 unit = normalize(gradient_vec); + float coord_offset = dot(unit, current_vec) / length(gradient_vec); + + for (uint i = 0; i < color_stops_size - 1; i++) { + float stop_offset = color_stop_offsets[i]; + float next_stop_offset = color_stop_offsets[i + 1]; + + if (stop_offset <= coord_offset && coord_offset <= next_stop_offset) { + fragColor = mix(color_stop_colors[i], color_stop_colors[i+1], smoothstep( + stop_offset, + next_stop_offset, + coord_offset + )); + } else if (coord_offset < color_stop_offsets[0]) { + fragColor = color_stop_colors[0]; + } else if (coord_offset > color_stop_offsets[color_stops_size - 1]) { + fragColor = color_stop_colors[color_stops_size - 1]; + } + } +} \ No newline at end of file -- cgit