voxel texture mapping
This commit is contained in:
parent
4565188f15
commit
0074bf1d1f
7 changed files with 165 additions and 77 deletions
|
|
@ -23,47 +23,67 @@ layout(push_constant) uniform pc {
|
|||
|
||||
const uint TRI_TO_CORNER[6] = uint[6](0u, 1u, 2u, 0u, 2u, 3u);
|
||||
|
||||
const vec3 NORMALS[6] = vec3[6](
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, -1.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0)
|
||||
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[6] = vec3[6](
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0)
|
||||
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[6] = vec3[6](
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0)
|
||||
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[16] = vec2[16](
|
||||
vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0),
|
||||
vec2(0.0, 0.5), vec2(0.0, 1.0), vec2(0.5, 1.0), vec2(0.5, 0.5),
|
||||
vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0),
|
||||
vec2(0.5, 0.0), vec2(0.5, 0.5), vec2(1.0, 0.5), vec2(1.0, 0.0)
|
||||
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[6][4] = vec3[6][4](
|
||||
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, 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)
|
||||
);
|
||||
|
||||
void main() {
|
||||
|
|
@ -84,9 +104,14 @@ void main() {
|
|||
uint voxelZ = (packedFace >> 10u) & 0x1Fu;
|
||||
uint faceId = (packedFace >> 15u) & 0x7u;
|
||||
uint matId = (packedFace >> 18u) & 0xFFu;
|
||||
uint texIdxX = (packedFace >> 26u) & 0x7u;
|
||||
uint texIdxY = (packedFace >> 29u) & 0x7u;
|
||||
|
||||
faceId = min(faceId, 5u);
|
||||
matId = min(matId, 3u);
|
||||
vec2 texID = vec2((texIdxX)/4.0,(texIdxY)/4.0);
|
||||
vec2 scalar = vec2(1.0/4.0,1.0/4.0);
|
||||
|
||||
faceId = min(faceId, 7u);
|
||||
matId = min(matId, 4u);
|
||||
|
||||
vec3 localPos = vec3(voxelX, voxelY, voxelZ) + FACE_CORNERS[faceId][cornerIndex];
|
||||
vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0;
|
||||
|
|
@ -99,5 +124,5 @@ void main() {
|
|||
outNormal = NORMALS[faceId];
|
||||
outTangent = TANGENTS[faceId];
|
||||
outBitangent = BITANGENTS[faceId];
|
||||
outTextCoords = CORNER_UVS[cornerIndex + (matId << 2u)];
|
||||
outTextCoords = CORNER_UVS_GRASS_BLOCK[faceId][cornerIndex] * scalar + texID;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue