84 lines
No EOL
2.7 KiB
GLSL
84 lines
No EOL
2.7 KiB
GLSL
#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);
|
|
} |