36 lines
825 B
GLSL
36 lines
825 B
GLSL
#version GLSL_VERSION
|
|
uniform uvec2 viewport;
|
|
in uvec4 rect; // left, top, right, bottom
|
|
in uint rect_color;
|
|
out vec3 color;
|
|
|
|
// indices into the rect vector
|
|
const int LEFT = 0;
|
|
const int TOP = 1;
|
|
const int RIGHT = 2;
|
|
const int BOTTOM = 3;
|
|
|
|
const uvec2 pos_map[] = uvec2[4](
|
|
uvec2(RIGHT, TOP),
|
|
uvec2(RIGHT, BOTTOM),
|
|
uvec2(LEFT, BOTTOM),
|
|
uvec2(LEFT, TOP)
|
|
);
|
|
|
|
vec2 to_opengl(uint x, uint y) {
|
|
return vec2(
|
|
-1.0 + 2.0 * (float(x) / float(viewport.x)),
|
|
1.0 - 2.0 * (float(y) / float(viewport.y))
|
|
);
|
|
}
|
|
|
|
float to_color(uint c) {
|
|
return float(c & uint(0xff)) / 255.0;
|
|
}
|
|
|
|
void main() {
|
|
uvec2 pos = pos_map[gl_VertexID];
|
|
gl_Position = vec4(to_opengl(rect[pos.x], rect[pos.y]), 0, 1);
|
|
color = vec3(to_color(rect_color >> 16), to_color(rect_color >> 8), to_color(rect_color));
|
|
}
|