#version 310 es // comments note the 16b alignment boundaries (see GL spec 7.6.2.2 Standard Uniform Block Layout) layout(std140) uniform UBO { // 16b boundary vec4 A; // 16b boundary vec2 B0; vec2 B1; // 16b boundary float C0; // 16b boundary (vec3 is aligned to 16b) vec3 C1; // 16b boundary vec3 D0; float D1; // 16b boundary float E0; float E1; float E2; float E3; // 16b boundary float F0; vec2 F1; // 16b boundary (vec2 before us is aligned to 8b) float F2; }; layout(location = 0) out vec4 oA; layout(location = 1) out vec4 oB; layout(location = 2) out vec4 oC; layout(location = 3) out vec4 oD; layout(location = 4) out vec4 oE; layout(location = 5) out vec4 oF; void main() { gl_Position = vec4(0.0); oA = A; oB = vec4(B0, B1); oC = vec4(C0, C1) + vec4(C1.xy, C1.z, C0); // not packed oD = vec4(D0, D1) + vec4(D0.xy, D0.z, D1); // packed - must convert for swizzle oE = vec4(E0, E1, E2, E3); oF = vec4(F0, F1, F2); }