aboutsummaryrefslogtreecommitdiffstats
path: root/examples/shaders
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-12-11 18:05:26 +0100
committerDavid Robillard <d@drobilla.net>2020-12-11 18:05:26 +0100
commitf829cfa6306c5c6dae0d0a885664fe0fe5a1b0b7 (patch)
tree14e963b9feac2b3135eb1f800e716abbd08e0581 /examples/shaders
parent07c8253c2621daab8a08713aae557ae1fdea5df0 (diff)
downloadpugl-f829cfa6306c5c6dae0d0a885664fe0fe5a1b0b7.tar.gz
pugl-f829cfa6306c5c6dae0d0a885664fe0fe5a1b0b7.tar.bz2
pugl-f829cfa6306c5c6dae0d0a885664fe0fe5a1b0b7.zip
Make demo programs work from any directory, and install them
Diffstat (limited to 'examples/shaders')
-rw-r--r--examples/shaders/header_330.glsl5
-rw-r--r--examples/shaders/header_420.glsl5
-rw-r--r--examples/shaders/rect.frag33
-rw-r--r--examples/shaders/rect.vert35
4 files changed, 78 insertions, 0 deletions
diff --git a/examples/shaders/header_330.glsl b/examples/shaders/header_330.glsl
new file mode 100644
index 0000000..bfe7a00
--- /dev/null
+++ b/examples/shaders/header_330.glsl
@@ -0,0 +1,5 @@
+#version 330 core
+
+#define INTER(qualifiers)
+#define UBO(qualifiers) layout(std140)
+
diff --git a/examples/shaders/header_420.glsl b/examples/shaders/header_420.glsl
new file mode 100644
index 0000000..55fbe8a
--- /dev/null
+++ b/examples/shaders/header_420.glsl
@@ -0,0 +1,5 @@
+#version 420 core
+
+#define INTER(qualifiers) layout(qualifiers)
+#define UBO(qualifiers) layout(std140, qualifiers)
+
diff --git a/examples/shaders/rect.frag b/examples/shaders/rect.frag
new file mode 100644
index 0000000..ecec50d
--- /dev/null
+++ b/examples/shaders/rect.frag
@@ -0,0 +1,33 @@
+/* The fragment shader uses the UV coordinates to calculate whether it is in
+ the T, R, B, or L border. These are then mixed with the border color, and
+ their inverse is mixed with the fill color, to calculate the fragment color.
+ For example, if we are in the top border, then T=1, so the border mix factor
+ TRBL=1, and the fill mix factor (1-TRBL) is 0.
+
+ The use of pixel units here is handy because the border width can be
+ specified precisely in pixels to draw sharp lines. The border width is just
+ hardcoded, but could be made a uniform or vertex attribute easily enough. */
+
+INTER(location = 0) noperspective in vec2 f_uv;
+INTER(location = 1) noperspective in vec2 f_size;
+INTER(location = 2) noperspective in vec4 f_fillColor;
+
+layout(location = 0) out vec4 FragColor;
+
+void
+main()
+{
+ const float borderWidth = 2.0;
+
+ vec4 borderColor = f_fillColor + vec4(0.0, 0.4, 0.4, 0.0);
+ float t = step(borderWidth, f_uv[1]);
+ float r = step(borderWidth, f_size.x - f_uv[0]);
+ float b = step(borderWidth, f_size.y - f_uv[1]);
+ float l = step(borderWidth, f_uv[0]);
+ float fillMix = t * r * b * l;
+ float borderMix = 1.0 - fillMix;
+ vec4 fill = fillMix * f_fillColor;
+ vec4 border = borderMix * borderColor;
+
+ FragColor = fill + border;
+}
diff --git a/examples/shaders/rect.vert b/examples/shaders/rect.vert
new file mode 100644
index 0000000..09f1917
--- /dev/null
+++ b/examples/shaders/rect.vert
@@ -0,0 +1,35 @@
+/* The vertex shader is trivial, but forwards scaled UV coordinates (in pixels)
+ to the fragment shader for drawing the border. */
+
+UBO(binding = 0) uniform UniformBufferObject
+{
+ mat4 projection;
+} ubo;
+
+layout(location = 0) in vec2 v_position;
+layout(location = 1) in vec2 v_origin;
+layout(location = 2) in vec2 v_size;
+layout(location = 3) in vec4 v_fillColor;
+
+INTER(location = 0) noperspective out vec2 f_uv;
+INTER(location = 1) noperspective out vec2 f_size;
+INTER(location = 2) noperspective out vec4 f_fillColor;
+
+void
+main()
+{
+ // clang-format off
+ mat4 m = mat4(v_size[0], 0.0, 0.0, 0.0,
+ 0.0, v_size[1], 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ v_origin[0], v_origin[1], 0.0, 1.0);
+ // clang-format on
+
+ mat4 MVP = ubo.projection * m;
+
+ f_uv = v_position * v_size;
+ f_size = v_size;
+ f_fillColor = v_fillColor;
+
+ gl_Position = MVP * vec4(v_position, 0.0, 1.0);
+}