106 lines
2.8 KiB
GLSL
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;
|
|
} |