Files
voxel/Shaders/shader.vert
Max Westerlund 71c5f3a3aa update
2025-09-02 13:17:15 +02:00

106 lines
2.8 KiB
GLSL

#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;
};
layout(std430, binding = 0) buffer FaceBuffer {
FaceData faces[];
};
out vec3 fragColor;
vec3 getVertexOffset(uint facing, uint vertIndex) {
if (facing == 0u) { // +X
vec3 offsets[6] = vec3[6](
vec3(0.5, -0.5, -0.5),
vec3(0.5, 0.5, 0.5),
vec3(0.5, -0.5, 0.5),
vec3(0.5, 0.5, 0.5),
vec3(0.5, -0.5, -0.5),
vec3(0.5, 0.5, -0.5)
);
return offsets[vertIndex];
} else if (facing == 1u) { // -X
vec3 offsets[6] = vec3[6](
vec3(-0.5, -0.5, 0.5),
vec3(-0.5, 0.5, -0.5),
vec3(-0.5, -0.5, -0.5),
vec3(-0.5, 0.5, -0.5),
vec3(-0.5, -0.5, 0.5),
vec3(-0.5, 0.5, 0.5)
);
return offsets[vertIndex];
} else if (facing == 2u) { // +Y (top)
vec3 offsets[6] = vec3[6](
vec3(-0.5, 0.5, -0.5),
vec3( 0.5, 0.5, 0.5),
vec3( 0.5, 0.5, -0.5),
vec3( 0.5, 0.5, 0.5),
vec3(-0.5, 0.5, -0.5),
vec3(-0.5, 0.5, 0.5)
);
return offsets[vertIndex];
} else if (facing == 3u) { // -Y (bottom)
vec3 offsets[6] = vec3[6](
vec3(-0.5, -0.5, 0.5),
vec3( 0.5, -0.5, -0.5),
vec3( 0.5, -0.5, 0.5),
vec3( 0.5, -0.5, -0.5),
vec3(-0.5, -0.5, 0.5),
vec3(-0.5, -0.5, -0.5)
);
return offsets[vertIndex];
} else if (facing == 4u) { // +Z (front)
vec3 offsets[6] = vec3[6](
vec3(-0.5, -0.5, 0.5),
vec3( 0.5, -0.5, 0.5),
vec3( 0.5, 0.5, 0.5),
vec3( 0.5, 0.5, 0.5),
vec3(-0.5, 0.5, 0.5),
vec3(-0.5, -0.5, 0.5)
);
return offsets[vertIndex];
} else if (facing == 5u) { // -Z (back)
vec3 offsets[6] = vec3[6](
vec3( 0.5, -0.5, -0.5),
vec3(-0.5, -0.5, -0.5),
vec3(-0.5, 0.5, -0.5),
vec3(-0.5, 0.5, -0.5),
vec3( 0.5, 0.5, -0.5),
vec3( 0.5, -0.5, -0.5)
);
return offsets[vertIndex];
}
}
uniform mat4 view;
uniform mat4 projection;
void main()
{
float[6] lightMult = float[6](
0.6,
0.6,
1.0,
0.5,
0.8,
0.8
);
uint faceIndex = gl_VertexID / 6;
uint vertIndex = gl_VertexID % 6;
FaceData f = faces[faceIndex];
vec3 basePos = vec3(f.x, f.y, f.z);
vec4 worldPos = vec4(basePos + getVertexOffset(f.facing, vertIndex), 1.0);
fragColor = vec3(1.0, 1.0, 1.0) * lightMult[f.facing];
gl_Position = projection * view * worldPos;
}