#version 450 #extension GL_EXT_buffer_reference : require layout(buffer_reference, std430) buffer Symbol { int top; uint left; uint width; uint height; uint advance; }; layout(buffer_reference, std430) buffer Character { vec3 pos; vec4 color; float size; uint code; }; layout(buffer_reference, std430) readonly buffer SymbolList{ Symbol symbols[]; }; layout(buffer_reference, std430) readonly buffer CharacterList{ Character characters[]; }; layout(buffer_reference, std430) readonly buffer Font { uint num_symbols; uint width; uint height; SymbolList symbol_list; }; layout(buffer_reference, std430) readonly buffer Pointers { uint padding[4]; CharacterList characters; }; layout(buffer_reference, std430) readonly buffer FontList { Font fonts[]; }; layout(buffer_reference, std430) readonly buffer UIContext { mat4 screen; FontList fonts; }; layout(std430, push_constant) uniform Push { UIContext ui; Pointers pointers; } push; layout(location = 0) out vec4 fragColor; layout(location = 1) out vec2 fragUV; layout(location = 2) out uint code; layout(location = 3) out uint font_index; const vec2 square[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0), vec2(0.0, 1.0), }; void main() { Character character = push.pointers.characters.characters[gl_InstanceIndex]; Font font = push.ui.fonts.fonts[0]; Symbol symbol = font.symbol_list.symbols[character.code]; float fragU = square[gl_VertexIndex].x * symbol.width/font.width; float fragV = square[gl_VertexIndex].y * symbol.height/font.height; float x = (square[gl_VertexIndex].x * symbol.width + symbol.left) * character.size / font.width; float y = (square[gl_VertexIndex].y * symbol.height - symbol.top) * character.size / font.height; fragUV = vec2(fragU, fragV); fragColor = character.color; gl_Position = push.ui.screen * vec4(vec3(x, y, 0.0) + character.pos, 1.0); code = character.code; font_index = 0; }