diff options
author | David Robillard <d@drobilla.net> | 2020-12-11 18:05:26 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-12-11 18:05:26 +0100 |
commit | f829cfa6306c5c6dae0d0a885664fe0fe5a1b0b7 (patch) | |
tree | 14e963b9feac2b3135eb1f800e716abbd08e0581 /examples/shaders | |
parent | 07c8253c2621daab8a08713aae557ae1fdea5df0 (diff) | |
download | pugl-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.glsl | 5 | ||||
-rw-r--r-- | examples/shaders/header_420.glsl | 5 | ||||
-rw-r--r-- | examples/shaders/rect.frag | 33 | ||||
-rw-r--r-- | examples/shaders/rect.vert | 35 |
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); +} |