#version 430 core struct FaceData { uint x; uint y; uint z; uint facing; // 0=+X,1=-X,2=+Y,3=-Y,4=+Z,5=-Z uint texture; }; layout(std430, binding = 0) buffer FaceBuffer { FaceData faces[]; }; out vec3 fragColor; vec3 getVertexOffset(uint facing, uint vertIndex) { if (facing == 0u) { // +X vec3 offsets[6] = vec3[6]( vec3(0.5, -0.5, -0.5), vec3(0.5, 0.5, 0.5), vec3(0.5, -0.5, 0.5), vec3(0.5, 0.5, 0.5), vec3(0.5, -0.5, -0.5), vec3(0.5, 0.5, -0.5) ); return offsets[vertIndex]; } else if (facing == 1u) { // -X vec3 offsets[6] = vec3[6]( vec3(-0.5, -0.5, 0.5), vec3(-0.5, 0.5, -0.5), vec3(-0.5, -0.5, -0.5), vec3(-0.5, 0.5, -0.5), vec3(-0.5, -0.5, 0.5), vec3(-0.5, 0.5, 0.5) ); return offsets[vertIndex]; } else if (facing == 2u) { // +Y (top) vec3 offsets[6] = vec3[6]( vec3(-0.5, 0.5, -0.5), vec3( 0.5, 0.5, 0.5), vec3( 0.5, 0.5, -0.5), vec3( 0.5, 0.5, 0.5), vec3(-0.5, 0.5, -0.5), vec3(-0.5, 0.5, 0.5) ); return offsets[vertIndex]; } else if (facing == 3u) { // -Y (bottom) vec3 offsets[6] = vec3[6]( vec3(-0.5, -0.5, 0.5), vec3( 0.5, -0.5, -0.5), vec3( 0.5, -0.5, 0.5), vec3( 0.5, -0.5, -0.5), vec3(-0.5, -0.5, 0.5), vec3(-0.5, -0.5, -0.5) ); return offsets[vertIndex]; } else if (facing == 4u) { // +Z (front) vec3 offsets[6] = vec3[6]( vec3(-0.5, -0.5, 0.5), vec3( 0.5, -0.5, 0.5), vec3( 0.5, 0.5, 0.5), vec3( 0.5, 0.5, 0.5), vec3(-0.5, 0.5, 0.5), vec3(-0.5, -0.5, 0.5) ); return offsets[vertIndex]; } else if (facing == 5u) { // -Z (back) vec3 offsets[6] = vec3[6]( vec3( 0.5, -0.5, -0.5), vec3(-0.5, -0.5, -0.5), vec3(-0.5, 0.5, -0.5), vec3(-0.5, 0.5, -0.5), vec3( 0.5, 0.5, -0.5), vec3( 0.5, -0.5, -0.5) ); return offsets[vertIndex]; } } uniform mat4 view; uniform mat4 projection; void main() { float[6] lightMult = float[6]( 0.6, 0.6, 1.0, 0.5, 0.8, 0.8 ); uint faceIndex = gl_VertexID / 6; uint vertIndex = gl_VertexID % 6; FaceData f = faces[faceIndex]; vec3 basePos = vec3(f.x, f.y, f.z); vec4 worldPos = vec4(basePos + getVertexOffset(f.facing, vertIndex), 1.0); fragColor = vec3(1.0, 1.0, 1.0) * lightMult[f.facing]; gl_Position = projection * view * worldPos; }