#version 450 #extension GL_EXT_buffer_reference : require struct Symbol { uint x; uint top; uint width; }; struct Character { uint code; }; layout(buffer_reference, std430) readonly buffer SymbolList{ Symbol symbols[]; }; layout(buffer_reference, std430) readonly buffer CharacterList{ Character characters[]; }; layout(set = 0, binding = 0) uniform UIUniform { mat4 screen; } ubo; layout(set = 1, binding = 0) uniform FontUniform { uint num_symbols; uint width; uint height; uint space_width; SymbolList symbol_list; CharacterList characters; } font; layout(location = 0) in vec2 inVertexPosition; layout(location = 1) in vec3 inPosition; layout(location = 2) in vec2 inSize; layout(location = 3) in vec4 inColor; layout(location = 4) in uint code; layout(location = 0) out vec4 fragColor; layout(location = 1) out vec2 fragUV; void main() { Symbol symbol = font.symbol_list.symbols[code]; Character character = font.characters.characters[0]; float fragU = (inVertexPosition.x*symbol.width + symbol.x) / font.width; float fragV = inVertexPosition.y + symbol.top / font.height; float x = inVertexPosition.x * inSize.x * symbol.width / font.height; float y = (inVertexPosition.y + float(symbol.top)/float(font.height)) * inSize.y; fragUV = vec2(fragU, fragV); fragColor = inColor; gl_Position = ubo.screen * vec4(vec3(x, y, 0.0) + inPosition, 1.0); }