166 lines
No EOL
6.6 KiB
GLSL
166 lines
No EOL
6.6 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);
|
|
|
|
const vec3 NORMALS[8] = vec3[8](
|
|
vec3( 0.0, 1.0, 0.0), // Face 0 (+Y)
|
|
vec3( 0.0, -1.0, 0.0), // Face 1 (-Y)
|
|
vec3( 1.0, 0.0, 0.0), // Face 2 (+X)
|
|
vec3(-1.0, 0.0, 0.0), // Face 3 (-X)
|
|
vec3( 0.0, 0.0, 1.0), // Face 4 (+Z)
|
|
vec3( 0.0, 0.0, -1.0), // Face 5 (-Z)
|
|
vec3(-0.7071, 0.0, 0.7071), // Face 6
|
|
vec3( 0.7071, 0.0, 0.7071) // Face 7
|
|
);
|
|
|
|
const vec3 TANGENTS[8] = vec3[8](
|
|
vec3( 1.0, 0.0, 0.0), // Face 0
|
|
vec3( 1.0, 0.0, 0.0), // Face 1
|
|
vec3( 0.0, 0.0, -1.0), // Face 2
|
|
vec3( 0.0, 0.0, 1.0), // Face 3
|
|
vec3( 1.0, 0.0, 0.0), // Face 4
|
|
vec3(-1.0, 0.0, 0.0), // Face 5
|
|
vec3( 0.7071, 0.0, 0.7071), // Face 6
|
|
vec3( 0.7071, 0.0,-0.7071) // Face 7
|
|
);
|
|
|
|
const vec3 BITANGENTS[8] = vec3[8](
|
|
vec3( 0.0, 0.0, 1.0), // Face 0
|
|
vec3( 0.0, 0.0, -1.0), // Face 1
|
|
vec3( 0.0, 1.0, 0.0), // Face 2
|
|
vec3( 0.0, 1.0, 0.0), // Face 3
|
|
vec3( 0.0, 1.0, 0.0), // Face 4
|
|
vec3( 0.0, 1.0, 0.0), // Face 5
|
|
vec3( 0.0, 1.0, 0.0), // Face 6
|
|
vec3( 0.0, 1.0, 0.0) // Face 7
|
|
);
|
|
|
|
const vec2 CORNER_UVS[5][4] = vec2[5][4](
|
|
vec2[4](vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0)),
|
|
vec2[4](vec2(0.0, 0.5), vec2(0.0, 1.0), vec2(0.5, 1.0), vec2(0.5, 0.5)),
|
|
vec2[4](vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0)),
|
|
vec2[4](vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0)),
|
|
vec2[4](vec2(1.0, 1.0), vec2(1.0, 0.5), vec2(0.5, 0.5), vec2(0.5, 1.0))
|
|
);
|
|
const vec2 CORNER_UVS_GRASS_BLOCK[8][4] = vec2[8][4](
|
|
vec2[4](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)),
|
|
vec2[4](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)),
|
|
vec2[4](vec2(1.0, 1.0), vec2(1.0, 0.0),vec2(0.0, 0.0), vec2(0.0, 1.0)),
|
|
vec2[4]( vec2(0.0, 1.0),vec2(1.0, 1.0), vec2(1.0, 0.0),vec2(0.0, 0.0)),
|
|
vec2[4]( vec2(0.0, 1.0),vec2(1.0, 1.0), vec2(1.0, 0.0),vec2(0.0, 0.0)),
|
|
vec2[4](vec2(1.0, 1.0), vec2(1.0, 0.0),vec2(0.0, 0.0), vec2(0.0, 1.0)),
|
|
vec2[4](vec2(1.0, 1.0), vec2(1.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 1.0)),
|
|
vec2[4](vec2(1.0, 1.0), vec2(1.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 1.0))
|
|
|
|
);
|
|
|
|
const vec3 FACE_CORNERS[8][4] = vec3[8][4](
|
|
vec3[4](vec3(0.0, 1.0, 0.0), vec3(0.0, 1.0, 1.0), vec3(1.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0)), // Face 0 (+Y)
|
|
vec3[4](vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), vec3(1.0, 0.0, 1.0), vec3(0.0, 0.0, 1.0)), // Face 1 (-Y)
|
|
vec3[4](vec3(1.0, 0.0, 0.0), vec3(1.0, 1.0, 0.0), vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 1.0)), // Face 2 (+X)
|
|
vec3[4](vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)), // Face 3 (-X)
|
|
vec3[4](vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 1.0), vec3(1.0, 1.0, 1.0), vec3(0.0, 1.0, 1.0)), // Face 4 (+Z)
|
|
vec3[4](vec3(0.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(1.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0)), // Face 5 (-Z)
|
|
vec3[4](vec3(0.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 1.0)), // Face 6 (cross model pane 1)
|
|
vec3[4](vec3(0.0, 0.0, 1.0), vec3(0.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0)) // Face 7 (cross model pane 2)
|
|
);
|
|
|
|
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 faceRecordIndex = uint(gl_VertexIndex) / 6u;
|
|
//uint triangleVertex = uint(gl_VertexIndex) % 6u;
|
|
//uint cornerIndex = TRI_TO_CORNER[triangleVertex];
|
|
|
|
uint packedFace = faces[faceRecordIndex];
|
|
|
|
uint voxelX = packedFace & 0xFu;
|
|
uint voxelY = (packedFace >> 4u) & 0xFu;
|
|
uint voxelZ = (packedFace >> 8u) & 0xFu;
|
|
uint faceId = (packedFace >> 12u) & 0x7u;
|
|
uint matId = (packedFace >> 15u) & 0x7FFu;
|
|
uint texIdxX = (packedFace >> 26u) & 0x7u;
|
|
uint texIdxY = (packedFace >> 29u) & 0x7u;
|
|
|
|
// (voxelPos.x & 0xFu) |
|
|
// ((voxelPos.y & 0xFu) << 4u) |
|
|
// ((voxelPos.z & 0xFu) << 8u) |
|
|
// ((faceIndex & 0x7u) << 12u) |
|
|
// ((materialId & 0x7FFu) << 15u) |
|
|
// ((textureIndexX & 0x7u) << 26u) |
|
|
// ((textureIndexY & 0x7u) << 29u);
|
|
|
|
vec2 texID = vec2((texIdxX)/4.0,(texIdxY)/4.0);
|
|
vec2 scalar = vec2(1.0/4.0,1.0/4.0);
|
|
|
|
faceId = min(faceId, 7u);
|
|
|
|
vec3 localPos = vec3(voxelX, voxelY, voxelZ) + FACE_CORNERS[faceId][cornerIndex];
|
|
vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0;
|
|
|
|
outTextCoord = CORNER_UVS_GRASS_BLOCK[faceId][cornerIndex] * scalar + texID;
|
|
outMaterialIdx = matId;
|
|
|
|
gl_Position = vec4(worldPos, 1.0);
|
|
} |