From 75ad35e0571dd03df8a5ae221b79dfe663799a1c Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:50:44 +1000 Subject: [PATCH] Add scratch buffer for position. Fixes lods "disappearing" when you zoom in --- .../section/MDICSectionRenderer.java | 6 ++++- .../voxy/shaders/lod/gl46/bindings.glsl | 9 +++++++ .../assets/voxy/shaders/lod/gl46/cmdgen.comp | 27 ++++++++++--------- .../assets/voxy/shaders/lod/gl46/quads2.vert | 25 ++++++++++++++--- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/section/MDICSectionRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/section/MDICSectionRenderer.java index ddd81b04..eea81377 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/section/MDICSectionRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/section/MDICSectionRenderer.java @@ -57,6 +57,7 @@ public class MDICSectionRenderer extends AbstractSectionRenderer #import @@ -34,13 +36,13 @@ uint encodeLocalLodPos(uint detail, ivec3 pos) { //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) { +void writeCmd(uint idx, uint instance, uint offset, uint quadCount) { DrawCommand cmd; cmd.count = quadCount * 6; cmd.instanceCount = 1; cmd.firstIndex = 0; cmd.baseVertex = int(offset)<<2; - cmd.baseInstance = encodedPos; + cmd.baseInstance = instance; cmdBuffer[idx] = cmd; } @@ -69,14 +71,15 @@ void main() { //This prevents overflow of the relative position encoder if (shouldRender) { - shouldRender = !any(lessThan(ivec3(254), abs(ipos-(baseSectionPos>>detail)))); + } if (shouldRender) { - uint encodedPos = encodeLocalLodPos(detail, ipos); uint ptr = extractQuadStart(meta); ivec3 relative = ipos-(baseSectionPos>>detail); + uint drawId = gl_GlobalInvocationID.x; + positionBuffer[drawId] = uvec2(meta.posA, meta.posB); uint msk = 0; @@ -98,56 +101,56 @@ void main() { count = meta.cntA&0xFFFF; if (count != 0) { //uint translucentCommandPtr = atomicAdd(translucentDrawCount, 1) + 400000;//FIXME: dont hardcode this offset - //writeCmd(translucentCommandPtr, encodedPos, ptr, count); + //writeCmd(translucentCommandPtr, drawId, ptr, count); } ptr += count; //Double sided quads count = (meta.cntA>>16)&0xFFFF; if (count != 0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //Down count = (meta.cntB)&0xFFFF; if (((msk&(1u<<0))!=0)) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //Up count = (meta.cntB>>16)&0xFFFF; if ((msk&(1u<<1))!=0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //North count = (meta.cntC)&0xFFFF; if ((msk&(1u<<2))!=0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //South count = (meta.cntC>>16)&0xFFFF; if ((msk&(1u<<3))!=0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //West count = (meta.cntD)&0xFFFF; if ((msk&(1u<<4))!=0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; //East count = (meta.cntD>>16)&0xFFFF; if ((msk&(1u<<5))!=0) { - writeCmd(cmdPtr++, encodedPos, ptr, count); + writeCmd(cmdPtr++, drawId, ptr, count); } ptr += count; } diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert index a4310ac0..a1f6cc21 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert @@ -5,6 +5,7 @@ #define SECTION_METADATA_BUFFER_BINDING 2 #define MODEL_BUFFER_BINDING 3 #define MODEL_COLOUR_BUFFER_BINDING 4 +#define POSITION_SCRATCH_BINDING 5 #define LIGHTING_SAMPLER_BINDING 1 @@ -25,6 +26,7 @@ layout(location = 5) out flat vec4 conditionalTinting; layout(location = 6) out flat uint quadDebug; #endif +/* uint extractLodLevel() { return uint(gl_BaseInstance)>>27; } @@ -33,7 +35,7 @@ uint extractLodLevel() { //Gives a relative position of +-255 relative to the player center in its respective lod ivec3 extractRelativeLodPos() { return (ivec3(gl_BaseInstance)<>ivec3(23); -} +}*/ vec4 uint2vec4RGBA(uint colour) { return vec4((uvec4(colour)>>uvec4(24,16,8,0))&uvec4(0xFF))/255.0; @@ -69,6 +71,21 @@ vec3 swizzelDataAxis(uint axis, vec3 data) { return data; } +uint extractDetail(uvec2 encPos) { + return encPos.x>>28; +} + +ivec3 extractLoDPosition(uvec2 encPos) { + int y = ((int(encPos.x)<<4)>>24); + int x = (int(encPos.y)<<4)>>8; + int z = int((encPos.x&((1u<<20)-1))<<4); + z |= int(encPos.y>>28); + z <<= 8; + z >>= 8; + return ivec3(x,y,z); +} + + //TODO: add a mechanism so that some quads can ignore backface culling // this would help alot with stuff like crops as they would look kinda weird i think, // same with flowers etc @@ -83,7 +100,9 @@ void main() { bool hasAO = modelHasMipmaps(model);//TODO: replace with per face AO flag bool isShaded = hasAO;//TODO: make this a per face flag - uint lodLevel = extractLodLevel(); + + uvec2 encPos = positionBuffer[gl_BaseInstance]; + uint lodLevel = extractDetail(encPos); vec2 modelUV = vec2(modelId&0xFFu, (modelId>>8)&0xFFu)*(1.0/(256.0)); @@ -153,7 +172,7 @@ void main() { cornerPos += swizzelDataAxis(face>>1, vec3(faceSize.xz, mix(depthOffset, 1-depthOffset, float(face&1u)))); - vec3 origin = vec3(((extractRelativeLodPos()<>1,vec3(cQuadSize,0)))*(1<