summaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorJoe Wilm <joe@jwilm.com>2016-06-06 13:20:35 -0700
committerJoe Wilm <joe@jwilm.com>2016-06-06 13:20:35 -0700
commited7aa96907e8c5e51facb45f9b590ce25b4f3dd5 (patch)
treedfd2185e57f9ff792d25ae7ca81d56b69e96096d /res
parent1f3f9add49d9b6fae8f57bb907b278eb06b513c9 (diff)
Refactor Instanced Drawing to use Vertex Arrays
Per-instanced data was previously stored in uniforms. This required several OpenGL calls to upload all of the data, and it was more complex to prepare (several vecs vs one). Additionally, drawing APIs are now accessible through a `RenderApi` (obtained through `QuadRenderer::with_api`) which enables some RAII patterns. Specifically, checks for batch flushing are handled in Drop.
Diffstat (limited to 'res')
-rw-r--r--res/text.f.glsl7
-rw-r--r--res/text.v.glsl43
2 files changed, 26 insertions, 24 deletions
diff --git a/res/text.f.glsl b/res/text.f.glsl
index d3265712..d2defb39 100644
--- a/res/text.f.glsl
+++ b/res/text.f.glsl
@@ -1,17 +1,14 @@
#version 330 core
in vec2 TexCoords;
-flat in int InstanceId;
+in vec3 fg;
layout(location = 0, index = 0) out vec4 color;
layout(location = 0, index = 1) out vec4 alphaMask;
uniform sampler2D mask;
-uniform ivec3 textColor[32];
void main()
{
- int i = InstanceId;
alphaMask = vec4(texture(mask, TexCoords).rgb, 1.0);
- vec3 textColorF = vec3(textColor[i]) / vec3(255.0, 255.0, 255.0);
- color = vec4(textColorF, 1.0);
+ color = vec4(fg, 1.0);
}
diff --git a/res/text.v.glsl b/res/text.v.glsl
index 66bfad0c..276b1dc3 100644
--- a/res/text.v.glsl
+++ b/res/text.v.glsl
@@ -1,46 +1,51 @@
#version 330 core
layout (location = 0) in vec2 position;
+// Cell properties
+layout (location = 1) in vec2 gridCoords;
+
+// glyph properties
+layout (location = 2) in vec4 glyph;
+
+// uv mapping
+layout (location = 3) in vec4 uv;
+
+// text fg color
+layout (location = 4) in vec3 textColor;
+
out vec2 TexCoords;
-flat out int InstanceId;
+out vec3 fg;
// Terminal properties
uniform vec2 termDim;
uniform vec2 cellDim;
uniform vec2 cellSep;
-// Cell properties
-uniform vec2 gridCoords[32];
-
-// glyph properties
-uniform vec2 glyphScale[32];
-uniform vec2 glyphOffset[32];
-
-// uv mapping
-uniform vec2 uvScale[32];
-uniform vec2 uvOffset[32];
-
// Orthographic projection
uniform mat4 projection;
void main()
{
- int i = gl_InstanceID;
+ vec2 glyphOffset = glyph.xy;
+ vec2 glyphSize = glyph.zw;
+
+ vec2 uvOffset = uv.xy;
+ vec2 uvSize = uv.zw;
// Position of cell from top-left
- vec2 cellPosition = (cellDim + cellSep) * gridCoords[i];
+ vec2 cellPosition = (cellDim + cellSep) * gridCoords;
// Invert Y since framebuffer origin is bottom-left
cellPosition.y = termDim.y - cellPosition.y - cellDim.y;
// Glyphs are offset within their cell; account for y-flip
- vec2 cellOffset = vec2(glyphOffset[i].x,
- glyphOffset[i].y - glyphScale[i].y);
+ vec2 cellOffset = vec2(glyphOffset.x,
+ glyphOffset.y - glyphSize.y);
// position coordinates are normalized on [0, 1]
- vec2 finalPosition = glyphScale[i] * position + cellPosition + cellOffset;
+ vec2 finalPosition = glyphSize * position + cellPosition + cellOffset;
gl_Position = projection * vec4(finalPosition.xy, 0.0, 1.0);
- TexCoords = vec2(position.x, 1 - position.y) * uvScale[i] + uvOffset[i];
- InstanceId = i;
+ TexCoords = uvOffset + vec2(position.x, 1 - position.y) * uvSize;
+ fg = textColor / vec3(255.0, 255.0, 255.0);
}