optimized faces

This commit is contained in:
maxwes08
2025-12-15 10:14:16 +01:00
parent 0641d22c9b
commit f532eddfbb
11 changed files with 107 additions and 141 deletions

View File

@@ -1,17 +1,12 @@
#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;
};
struct FaceData {
uint pack; // All data in 4 bytes
};
layout(std430, binding = 0) buffer FaceBuffer {
uint faces[];
};
layout(std430, binding = 0) buffer FaceBuffer {
uint faces[];
};
uniform mat4 view;
uniform mat4 projection;
@@ -77,23 +72,35 @@ const vec3 offsets[6][6] = vec3[6][6](
const vec2 uvs[6] = vec2[6](vec2(0,0), vec2(1,1), vec2(1,0), vec2(1,1), vec2(0,0), vec2(0,1));
// Function to unpack the 4-byte face data
// Bit layout from C# (little-endian, but we read as uint):
// Bits 31-24: Y (8 bits) 0-255
// Bits 23-20: Z (4 bits) 0-15
// Bits 19-16: X (4 bits) 0-15
// Bits 15-10: Texture (6 bits) 0-63
// Bits 9-7: Facing (3 bits) 0-7
// Bits 6-3: Light (4 bits) 0-15
// Bits 2-0: unused (3 bits)
void unpackFace(uint pack, out uint x, out uint y, out uint z,
out uint facing, out uint texture, out uint lightLevel)
{
y = (pack >> 24) & 0xFFu; // Y: bits 24-31 (8 bits)
z = (pack >> 20) & 0x0Fu; // Z: bits 20-23 (4 bits)
x = (pack >> 16) & 0x0Fu; // X: bits 16-19 (4 bits)
texture = (pack >> 10) & 0x3Fu; // Texture: bits 10-15 (6 bits)
facing = (pack >> 7) & 0x07u; // Facing: bits 7-9 (3 bits)
lightLevel = (pack >> 3) & 0x0Fu;// Light: bits 3-6 (4 bits)
}
void main()
{
uint faceIndex = gl_VertexID / 6u;
uint vertIndex = gl_VertexID % 6u;
uint start = faceIndex * 2u; // 2 uint per face
uint u0 = faces[start]; // data in uint 0
uint u1 = faces[start + 1]; // data in uint 1
uint pack = faces[faceIndex];
// 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;
uint x, y, z, facing, texture, lightLevel;
unpackFace(pack, x, y, z, facing, texture, lightLevel);
vec3 basePos = vec3(x, y, z) + vec3(chunkX, 0, chunkY) * 16.0;