summaryrefslogtreecommitdiff
path: root/src/assets/shaders/text
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/shaders/text')
-rw-r--r--src/assets/shaders/text/frag.glsl55
-rw-r--r--src/assets/shaders/text/vert.glsl26
2 files changed, 81 insertions, 0 deletions
diff --git a/src/assets/shaders/text/frag.glsl b/src/assets/shaders/text/frag.glsl
new file mode 100644
index 0000000..3a1694f
--- /dev/null
+++ b/src/assets/shaders/text/frag.glsl
@@ -0,0 +1,55 @@
+#version 300 es
+precision highp float;
+
+uniform sampler2D texture_data;
+uniform int text_length;
+uniform int text[256];
+uniform int char_width;
+uniform int char_height;
+uniform int font_width;
+uniform int font_height;
+uniform int text_width;
+uniform int text_height;
+
+in vec2 vertex_texcoord;
+out vec4 frag_color;
+
+void main()
+{
+ vec2 inverted_texcoord = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
+ vec2 texcoord_pixels = inverted_texcoord * vec2(float(text_width), float(text_height));
+ int texcoord_char_x = int(floor(texcoord_pixels.x)) / char_width;
+ int texcoord_char_y = int(floor(texcoord_pixels.y)) / char_height;
+
+ int x = 0;
+ int y = 0;
+ int i = 0;
+ for (; i < text_length; ++i) {
+ if (x == texcoord_char_x && y == texcoord_char_y) {
+ break;
+ }
+ if (text[i] == 10) {
+ x = 0;
+ y += 1;
+ } else {
+ x += 1;
+ }
+ }
+ if (i == text_length || text[i] == 10) discard;
+
+ int entry = text[i] - 32;
+ vec2 texcoord_base = vec2(
+ float(entry % (font_width / char_width)) * float(char_width),
+ float(entry / (font_width / char_width)) * float(char_height)
+ );
+ // vec2 texcoord_base = vec2(8.0, 0.0);
+ vec2 texcoord_off = vec2(
+ mod(texcoord_pixels.x, float(char_width)),
+ mod(texcoord_pixels.y, float(char_height))
+ );
+ vec2 texcoord_final = (texcoord_base + texcoord_off) / vec2(float(font_width), float(font_height));
+
+ vec4 texel = texture(texture_data, texcoord_final);
+ if (texel.rgb == vec3(0.0, 0.0, 0.0)) discard;
+ frag_color = texel;
+} \ No newline at end of file
diff --git a/src/assets/shaders/text/vert.glsl b/src/assets/shaders/text/vert.glsl
new file mode 100644
index 0000000..4005d75
--- /dev/null
+++ b/src/assets/shaders/text/vert.glsl
@@ -0,0 +1,26 @@
+#version 300 es
+precision highp float;
+
+uniform mat4 view;
+uniform mat4 position;
+
+out vec2 vertex_texcoord;
+
+void main() {
+ const vec2 positions[4] = vec2[](
+ vec2(-1, -1),
+ vec2(+1, -1),
+ vec2(-1, +1),
+ vec2(+1, +1)
+ );
+ const vec2 coords[4] = vec2[](
+ vec2(0, 0),
+ vec2(1, 0),
+ vec2(0, 1),
+ vec2(1, 1)
+ );
+ vec4 vertex = vec4(positions[gl_VertexID], 0.0, 1.0);
+
+ vertex_texcoord = coords[gl_VertexID];
+ gl_Position = view * position * vertex;
+}