diff options
author | Joe Wilm <joe@jwilm.com> | 2016-06-06 13:20:35 -0700 |
---|---|---|
committer | Joe Wilm <joe@jwilm.com> | 2016-06-06 13:20:35 -0700 |
commit | ed7aa96907e8c5e51facb45f9b590ce25b4f3dd5 (patch) | |
tree | dfd2185e57f9ff792d25ae7ca81d56b69e96096d /res/text.v.glsl | |
parent | 1f3f9add49d9b6fae8f57bb907b278eb06b513c9 (diff) | |
download | alacritty-ed7aa96907e8c5e51facb45f9b590ce25b4f3dd5.tar.gz alacritty-ed7aa96907e8c5e51facb45f9b590ce25b4f3dd5.zip |
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/text.v.glsl')
-rw-r--r-- | res/text.v.glsl | 43 |
1 files changed, 24 insertions, 19 deletions
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); } |