Fixed directional culling and added AABB raster
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user