#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; uint lightLevel; }; layout(std430, binding = 0) buffer FaceBuffer { uint faces[]; }; uniform mat4 view; uniform mat4 projection; uniform int chunkX; uniform int chunkY; out vec2 fragUV; out float lighting; out vec3 fragPos; const float lightMult[6] = float[6](0.6, 0.6, 1.0, 0.5, 0.8, 0.8); const vec3 offsets[6][6] = vec3[6][6]( vec3[6]( // +X vec3(1, 0, 0), vec3(1, 1, 1), vec3(1, 0, 1), vec3(1, 1, 1), vec3(1, 0, 0), vec3(1, 1, 0) ), vec3[6]( // -X vec3(0, 0, 1), vec3(0, 1, 0), vec3(0, 0, 0), vec3(0, 1, 0), vec3(0, 0, 1), vec3(0, 1, 1) ), vec3[6]( // +Y vec3(0, 1, 0), vec3(1, 1, 1), vec3(1, 1, 0), vec3(1, 1, 1), vec3(0, 1, 0), vec3(0, 1, 1) ), vec3[6]( // -Y vec3(0, 0, 1), vec3(1, 0, 0), vec3(1, 0, 1), vec3(1, 0, 0), vec3(0, 0, 1), vec3(0, 0, 0) ), vec3[6]( // +Z vec3(1, 0, 1), vec3(0, 1, 1), vec3(0, 0, 1), vec3(0, 1, 1), vec3(1, 0, 1), vec3(1, 1, 1) ), vec3[6]( // -Z vec3(0, 0, 0), vec3(1, 1, 0), vec3(1, 0, 0), vec3(1, 1, 0), vec3(0, 0, 0), vec3(0, 1, 0) ) ); const vec2 uvs[6] = vec2[6](vec2(0,0), vec2(1,1), vec2(1,0), vec2(1,1), vec2(0,0), vec2(0,1)); void main() { uint faceIndex = gl_VertexID / 6u; uint vertIndex = gl_VertexID % 6u; uint start = faceIndex * 2u; // 2 byte per face uint u0 = faces[start]; // data in uint 0 uint u1 = faces[start + 1]; // data in uint 1 // extract values from bits uint x = u0 & 0xFFu; uint y = (u0 >> 8) & 0xFFu; uint z = (u0 >> 16) & 0xFFu; uint facing = (u0 >> 24) & 0xFFu; uint texture = u1 & 0xFFu; uint lightLevel = (u1 >> 8) & 0xFFu; vec3 basePos = vec3(x + chunkX * 16, y, z + chunkY * 16); vec4 worldPos = vec4(basePos + offsets[facing][vertIndex], 1.0); float light = float(lightLevel) / 255.0; // use later for caves and stuff // UV mapping uint col = texture & 15u; // texture % 16 uint row = texture >> 4; // texture / 16 row = 15u - row; // invert row so 0 is top // convert to float after int math, divide by 16 vec2 uv = uvs[vertIndex] * 0.0625; uv.x += float(col) * 0.0625; uv.y += float(row) * 0.0625; fragUV = uv; lighting = lightMult[facing]; fragPos = vec3(worldPos.x, worldPos.y, worldPos.z); gl_Position = projection * view * worldPos; }