Culling, rendering improvements and optimizations, block removing test.
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
#version 430 core
|
||||
|
||||
out vec4 FragColor;
|
||||
in vec3 fragColor;
|
||||
in vec2 fragUV;
|
||||
in float lighting;
|
||||
|
||||
uniform sampler2D uTexture;
|
||||
|
||||
void main()
|
||||
{
|
||||
FragColor = vec4(fragColor, 1.0);
|
||||
vec4 texColor = texture(uTexture, fragUV);
|
||||
FragColor = vec4(texColor.rgb * lighting, texColor.a);
|
||||
}
|
||||
@@ -6,101 +6,108 @@ struct FaceData {
|
||||
uint z;
|
||||
uint facing; // 0=+X,1=-X,2=+Y,3=-Y,4=+Z,5=-Z
|
||||
uint texture;
|
||||
uint lightLevel;
|
||||
};
|
||||
|
||||
layout(std430, binding = 0) buffer FaceBuffer {
|
||||
FaceData faces[];
|
||||
uint 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;
|
||||
|
||||
out vec2 fragUV;
|
||||
out float lighting;
|
||||
|
||||
const float lightMult[6] = float[6](0.6, 0.6, 1.0, 0.5, 0.8, 0.8);
|
||||
|
||||
const vec3 offsets[6][6] = vec3[6][6](
|
||||
vec3[6]( // +X
|
||||
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)
|
||||
),
|
||||
vec3[6]( // -X
|
||||
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)
|
||||
),
|
||||
vec3[6]( // +Y
|
||||
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)
|
||||
),
|
||||
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)
|
||||
),
|
||||
vec3[6]( // +Z
|
||||
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)
|
||||
),
|
||||
vec3[6]( // -Z
|
||||
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)
|
||||
)
|
||||
);
|
||||
|
||||
const vec2 uvs[6] = vec2[6](vec2(0,0), vec2(1,1), vec2(1,0), vec2(1,1), vec2(0,0), vec2(0,1));
|
||||
|
||||
void main()
|
||||
{
|
||||
float[6] lightMult = float[6](
|
||||
0.6,
|
||||
0.6,
|
||||
1.0,
|
||||
0.5,
|
||||
0.8,
|
||||
0.8
|
||||
);
|
||||
uint faceIndex = gl_VertexID / 6u;
|
||||
uint vertIndex = gl_VertexID % 6u;
|
||||
|
||||
uint faceIndex = gl_VertexID / 6;
|
||||
uint vertIndex = gl_VertexID % 6;
|
||||
uint start = faceIndex * 2u; // 2 byte per face
|
||||
|
||||
uint u0 = faces[start]; // data in uint 0
|
||||
uint u1 = faces[start + 1]; // data in uint 1
|
||||
|
||||
FaceData f = faces[faceIndex];
|
||||
vec3 basePos = vec3(f.x, f.y, f.z);
|
||||
vec4 worldPos = vec4(basePos + getVertexOffset(f.facing, vertIndex), 1.0);
|
||||
// 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;
|
||||
|
||||
|
||||
fragColor = vec3(1.0, 1.0, 1.0) * lightMult[f.facing];
|
||||
vec3 basePos = vec3(x, y, z);
|
||||
vec4 worldPos = vec4(basePos + offsets[facing][vertIndex], 1.0);
|
||||
float light = float(lightLevel) / 255.0; // use later for caves and stuff
|
||||
|
||||
// UV mapping
|
||||
uint col = texture & 15u; // texture % 16
|
||||
uint row = texture >> 4; // texture / 16
|
||||
row = 15u - row; // invert row so 0 is top
|
||||
|
||||
// convert to float after int math, divide by 16
|
||||
vec2 uv = uvs[vertIndex] * 0.0625;
|
||||
uv.x += float(col) * 0.0625;
|
||||
uv.y += float(row) * 0.0625;
|
||||
|
||||
fragUV = uv;
|
||||
lighting = lightMult[facing];
|
||||
|
||||
gl_Position = projection * view * worldPos;
|
||||
}
|
||||
Reference in New Issue
Block a user