Fixed directional culling and added AABB raster

This commit is contained in:
mcrcortex
2024-01-29 15:12:50 +10:00
parent 787dc88c43
commit 4d28a5a8c9
3 changed files with 325 additions and 110 deletions

View File

@@ -7,6 +7,7 @@ layout(local_size_x = 128, local_size_y = 1, local_size_x = 1) in;
#import <zenith:lod/gl46/bindings.glsl>
#import <zenith:lod/gl46/frustum.glsl>
#import <zenith:lod/gl46/section.glsl>
#line 11
//https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_16bit_storage.txt
// adds support for uint8_t which can use for compact visibility buffer
@@ -27,7 +28,16 @@ uint encodeLocalLodPos(uint detail, ivec3 pos) {
}
//TODO: swap to a multidraw indirect counted
//Note: if i want reverse indexing i need to use the index buffer offset to offset
void writeCmd(uint idx, uint encodedPos, uint offset, uint quadCount) {
DrawCommand cmd;
cmd.count = quadCount * 6;
cmd.instanceCount = 1;
cmd.firstIndex = 0;
cmd.baseVertex = int(offset)<<2;
cmd.baseInstance = encodedPos;
cmdBuffer[idx] = cmd;
}
void main() {
if (gl_GlobalInvocationID.x >= sectionCount) {
@@ -55,14 +65,76 @@ void main() {
}
if (shouldRender) {
uint basePtr = extractQuadStart(meta);
uint encodedPos = encodeLocalLodPos(detail, ipos);
uint ptr = extractQuadStart(meta);
ivec3 relative = ipos-(baseSectionPos>>detail);
DrawCommand cmd;
cmd.count = (meta.cntA&0xFFFF) * 6;
cmd.instanceCount = 1;
cmd.firstIndex = 0;
cmd.baseVertex = int(basePtr)<<2;
cmd.baseInstance = encodeLocalLodPos(detail, ipos);
cmdBuffer[atomicAdd(opaqueDrawCount, 1)] = cmd;
//TODO:FIXME: Figure out why these are in such a weird order
uint msk = 0;
msk |= uint(relative.y>-1)<<0;
msk |= uint(relative.y<1 )<<1;
msk |= uint(relative.z>-1)<<2;
msk |= uint(relative.z<1 )<<3;
msk |= uint(relative.x>-1)<<4;
msk |= uint(relative.x<1 )<<5;
uint cmdPtr = atomicAdd(opaqueDrawCount, bitCount(msk)+1);
uint count = 0;
//Translucency
count = meta.cntA&0xFFFF;
ptr += count;
//Double sided quads
count = (meta.cntA>>16)&0xFFFF;
writeCmd(cmdPtr++, encodedPos, ptr, count);
ptr += count;
//Down
count = (meta.cntB)&0xFFFF;
if ((msk&(1<<0))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
//Up
count = (meta.cntB>>16)&0xFFFF;
if ((msk&(1<<1))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
//North
count = (meta.cntC)&0xFFFF;
if ((msk&(1<<2))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
//South
count = (meta.cntC>>16)&0xFFFF;
if ((msk&(1<<3))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
//West
count = (meta.cntD)&0xFFFF;
if ((msk&(1<<4))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
//East
count = (meta.cntD>>16)&0xFFFF;
if ((msk&(1<<5))!=0) {
writeCmd(cmdPtr++, encodedPos, ptr, count);
}
ptr += count;
}
}