#version 450 layout(set = 3, binding = 0) readonly buffer FaceBuffer { uint faces[]; }; layout(push_constant) uniform matrices { vec4 ModelOffset; vec4 Padding0; vec4 Padding1; vec4 Padding2; uint materialIdx; } push_constants; layout(location = 0) out vec2 outTextCoord; layout(location = 1) out flat uint outMaterialIdx; const uint TRI_TO_CORNER[6] = uint[6](0u, 1u, 2u, 0u, 2u, 3u); vec3 buildFaceCornerPosition(uvec3 voxelPos, uint faceId, uint cornerIndex) { vec3 p = vec3(voxelPos); if (faceId == 0u) { if (cornerIndex == 0u) return p + vec3(0.0, 1.0, 0.0); if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 1.0); if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0); return p + vec3(1.0, 1.0, 0.0); } if (faceId == 1u) { if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0); if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 0.0); if (cornerIndex == 2u) return p + vec3(1.0, 0.0, 1.0); return p + vec3(0.0, 0.0, 1.0); } if (faceId == 2u) { if (cornerIndex == 0u) return p + vec3(1.0, 0.0, 0.0); if (cornerIndex == 1u) return p + vec3(1.0, 1.0, 0.0); if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0); return p + vec3(1.0, 0.0, 1.0); } if (faceId == 3u) { if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0); if (cornerIndex == 1u) return p + vec3(0.0, 0.0, 1.0); if (cornerIndex == 2u) return p + vec3(0.0, 1.0, 1.0); return p + vec3(0.0, 1.0, 0.0); } if (faceId == 4u) { if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 1.0); if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 1.0); if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0); return p + vec3(0.0, 1.0, 1.0); } if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0); if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 0.0); if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 0.0); return p + vec3(1.0, 0.0, 0.0); } void main() { uint faceRecordIndex = uint(gl_VertexIndex) / 6u; uint triangleVertex = uint(gl_VertexIndex) % 6u; uint cornerIndex = TRI_TO_CORNER[triangleVertex]; uint packedFace = faces[faceRecordIndex]; uint voxelX = packedFace & 0x1Fu; uint voxelY = (packedFace >> 5u) & 0x1Fu; uint voxelZ = (packedFace >> 10u) & 0x1Fu; uint faceId = (packedFace >> 15u) & 0x7u; uint matId = (packedFace >> 18u) & 0xFFu; vec3 localPos = buildFaceCornerPosition(uvec3(voxelX, voxelY, voxelZ), faceId, cornerIndex); vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0; outTextCoord = vec2(0.0); outMaterialIdx = matId; gl_Position = vec4(worldPos, 1.0); }