summaryrefslogtreecommitdiff
path: root/shaders/polygon.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'shaders/polygon.glsl')
-rw-r--r--shaders/polygon.glsl64
1 files changed, 64 insertions, 0 deletions
diff --git a/shaders/polygon.glsl b/shaders/polygon.glsl
new file mode 100644
index 0000000..e33aaf7
--- /dev/null
+++ b/shaders/polygon.glsl
@@ -0,0 +1,64 @@
+#version 330 core
+
+// --------------------------------------------------------------------------------
+// Regular polygon shader
+//
+// ref: https://thndl.com/square-shaped-shaders.html
+// ref: https://thebookofshaders.com/07/
+//
+// @model quad
+// @uniform int u_n 3 3 12
+// @uniform color u_bg 0 0 0 1
+// @uniform color u_fg 1 1 1 1
+//
+// SPDX-License-Identifier: 0BSD
+// --------------------------------------------------------------------------------
+
+// --------------------------------------------------------------------------------
+// Uniforms
+// --------------------------------------------------------------------------------
+uniform float u_time;
+uniform vec2 u_res;
+uniform int u_n;
+uniform vec4 u_bg;
+uniform vec4 u_fg;
+
+// --------------------------------------------------------------------------------
+// Vertex outputs
+// --------------------------------------------------------------------------------
+in vec2 v_p;
+in vec2 v_t;
+
+// --------------------------------------------------------------------------------
+// Fragment outputs
+// --------------------------------------------------------------------------------
+out vec4 f_c;
+
+// --------------------------------------------------------------------------------
+// Entry point
+// --------------------------------------------------------------------------------
+
+#define PI 3.14159265359
+
+void main()
+{
+ // Centered with square aspect ratio
+ vec2 st = gl_FragCoord.xy / u_res.xy;
+ float aspect = u_res.x / u_res.y;
+ if (aspect > 1.0f) { st.x = (st.x - 0.5f) * aspect + 0.5f; }
+ else { st.y = (st.y - 0.5f) / aspect + 0.5f; }
+
+ // Remap [0, 1] to [-1, 1]
+ st = st * 2.0f - 1.0f;
+
+ // Angle of pixel from center + rotation
+ float a = atan(st.y, st.x) + u_time * 0.2f;
+
+ // Angle of each sector from center
+ float r = (PI * 2.0f) / float(u_n);
+
+ // Polar polygon edge test. cos(theta) = dot product.
+ float d = cos(floor(0.5f + a / r) * r - a) * length(st);
+
+ f_c = vec4(vec3(mix(u_bg, u_fg, 1.0f - step(0.5f, d))), 1.0f);
+}