summaryrefslogtreecommitdiffstats
path: root/glow/src/shader/common
diff options
context:
space:
mode:
Diffstat (limited to 'glow/src/shader/common')
-rw-r--r--glow/src/shader/common/gradient.frag59
-rw-r--r--glow/src/shader/common/gradient.vert9
-rw-r--r--glow/src/shader/common/image.frag22
-rw-r--r--glow/src/shader/common/image.vert9
-rw-r--r--glow/src/shader/common/solid.frag (renamed from glow/src/shader/common/triangle.frag)2
-rw-r--r--glow/src/shader/common/solid.vert (renamed from glow/src/shader/common/triangle.vert)2
6 files changed, 101 insertions, 2 deletions
diff --git a/glow/src/shader/common/gradient.frag b/glow/src/shader/common/gradient.frag
new file mode 100644
index 00000000..9af0cb6e
--- /dev/null
+++ b/glow/src/shader/common/gradient.frag
@@ -0,0 +1,59 @@
+#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 vec4 gradient_direction;
+uniform int color_stops_size;
+// GLSL does not support dynamically sized arrays without SSBOs so this is capped to 16 stops
+//stored as color(vec4) -> offset(vec4) sequentially;
+uniform vec4 color_stops[32];
+
+//TODO: rewrite without branching to make ALUs happy
+void main() {
+ vec2 start = gradient_direction.xy;
+ vec2 end = gradient_direction.zw;
+ vec2 gradient_vec = vec2(end - start);
+ vec2 current_vec = vec2(raw_position.xy - start);
+ vec2 unit = normalize(gradient_vec);
+ float coord_offset = dot(unit, current_vec) / length(gradient_vec);
+ //if a gradient has a start/end stop that is identical, the mesh will have a transparent fill
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
+
+ float min_offset = color_stops[1].x;
+ float max_offset = color_stops[color_stops_size - 1].x;
+
+ for (int i = 0; i < color_stops_size - 2; i += 2) {
+ float curr_offset = color_stops[i+1].x;
+ float next_offset = color_stops[i+3].x;
+
+ if (coord_offset <= min_offset) {
+ //current coordinate is before the first defined offset, set it to the start color
+ gl_FragColor = color_stops[0];
+ }
+
+ if (curr_offset <= coord_offset && coord_offset <= next_offset) {
+ //current fragment is between the current offset processing & the next one, interpolate colors
+ gl_FragColor = mix(color_stops[i], color_stops[i+2], smoothstep(
+ curr_offset,
+ next_offset,
+ coord_offset
+ ));
+ }
+
+ if (coord_offset >= max_offset) {
+ //current coordinate is before the last defined offset, set it to the last color
+ gl_FragColor = color_stops[color_stops_size - 2];
+ }
+ }
+}
diff --git a/glow/src/shader/common/gradient.vert b/glow/src/shader/common/gradient.vert
new file mode 100644
index 00000000..fe505997
--- /dev/null
+++ b/glow/src/shader/common/gradient.vert
@@ -0,0 +1,9 @@
+uniform mat4 u_Transform;
+
+in vec2 i_Position;
+out vec2 raw_position;
+
+void main() {
+ gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);
+ raw_position = i_Position;
+}
diff --git a/glow/src/shader/common/image.frag b/glow/src/shader/common/image.frag
new file mode 100644
index 00000000..5e05abdf
--- /dev/null
+++ b/glow/src/shader/common/image.frag
@@ -0,0 +1,22 @@
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+
+uniform sampler2D tex;
+in vec2 tex_pos;
+
+#ifdef HIGHER_THAN_300
+out vec4 fragColor;
+#define gl_FragColor fragColor
+#endif
+#ifdef GL_ES
+#define texture texture2D
+#endif
+
+void main() {
+ gl_FragColor = texture(tex, tex_pos);
+}
diff --git a/glow/src/shader/common/image.vert b/glow/src/shader/common/image.vert
new file mode 100644
index 00000000..93e541f2
--- /dev/null
+++ b/glow/src/shader/common/image.vert
@@ -0,0 +1,9 @@
+uniform mat4 u_Transform;
+
+in vec2 i_Position;
+out vec2 tex_pos;
+
+void main() {
+ gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);
+ tex_pos = i_Position;
+}
diff --git a/glow/src/shader/common/triangle.frag b/glow/src/shader/common/solid.frag
index e8689f2e..174ffdd3 100644
--- a/glow/src/shader/common/triangle.frag
+++ b/glow/src/shader/common/solid.frag
@@ -15,4 +15,4 @@ in vec4 v_Color;
void main() {
gl_FragColor = v_Color;
-} \ No newline at end of file
+}
diff --git a/glow/src/shader/common/triangle.vert b/glow/src/shader/common/solid.vert
index d0494a5f..59ed88e5 100644
--- a/glow/src/shader/common/triangle.vert
+++ b/glow/src/shader/common/solid.vert
@@ -8,4 +8,4 @@ out vec4 v_Color;
void main() {
gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);
v_Color = i_Color;
-} \ No newline at end of file
+}