From c2c622226b1c8383417bb5635dd89f1c1bda7895 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Mon, 29 Jan 2024 15:39:48 +1000 Subject: [PATCH] Hacked in translucency rendering without sorting --- .../cortex/zenith/client/core/VoxelCore.java | 3 + .../rendering/AbstractFarWorldRenderer.java | 2 + .../core/rendering/Gl46FarWorldRenderer.java | 65 +++++++++++++------ .../zenith/shaders/lod/gl46/cmdgen.comp | 5 +- 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/main/java/me/cortex/zenith/client/core/VoxelCore.java b/src/main/java/me/cortex/zenith/client/core/VoxelCore.java index 87a60391..79944b67 100644 --- a/src/main/java/me/cortex/zenith/client/core/VoxelCore.java +++ b/src/main/java/me/cortex/zenith/client/core/VoxelCore.java @@ -133,6 +133,9 @@ public class VoxelCore { //glBindFramebuffer(GL_FRAMEBUFFER, boundFB); //this.postProcessing.renderPost(boundFB); + + //We can render the translucent directly after as it is the furthest translucent objects + this.renderer.renderFarAwayTranslucent(); } public void addDebugInfo(List debug) { diff --git a/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java b/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java index fba5ec49..b8b9cf26 100644 --- a/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java +++ b/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java @@ -84,6 +84,8 @@ public abstract class AbstractFarWorldRenderer { public abstract void renderFarAwayOpaque(MatrixStack stack, double cx, double cy, double cz); + public abstract void renderFarAwayTranslucent(); + public void enqueueResult(BuiltSection result) { this.geometry.enqueueResult(result); } diff --git a/src/main/java/me/cortex/zenith/client/core/rendering/Gl46FarWorldRenderer.java b/src/main/java/me/cortex/zenith/client/core/rendering/Gl46FarWorldRenderer.java index 16745612..7bd6a1a6 100644 --- a/src/main/java/me/cortex/zenith/client/core/rendering/Gl46FarWorldRenderer.java +++ b/src/main/java/me/cortex/zenith/client/core/rendering/Gl46FarWorldRenderer.java @@ -59,7 +59,7 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer { public Gl46FarWorldRenderer(int geometryBuffer, int maxSections) { super(geometryBuffer, maxSections); - this.glCommandBuffer = new GlBuffer(maxSections*5L*4); + this.glCommandBuffer = new GlBuffer(maxSections*5L*4 * 6); this.glCommandCountBuffer = new GlBuffer(4*2); this.glVisibilityBuffer = new GlBuffer(maxSections*4L); glClearNamedBufferData(this.glCommandBuffer.id, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, new int[1]); @@ -84,6 +84,26 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer { glBindVertexArray(0); } + //FIXME: dont do something like this as it breaks multiviewport mods + private int frameId = 0; + private void updateUniformBuffer(MatrixStack stack, double cx, double cy, double cz) { + long ptr = UploadStream.INSTANCE.upload(this.uniformBuffer, 0, this.uniformBuffer.size()); + var mat = new Matrix4f(RenderSystem.getProjectionMatrix()).mul(stack.peek().getPositionMatrix()); + var innerTranslation = new Vector3f((float) (cx-(this.sx<<5)), (float) (cy-(this.sy<<5)), (float) (cz-(this.sz<<5))); + mat.translate(-innerTranslation.x, -innerTranslation.y, -innerTranslation.z); + mat.getToAddress(ptr); ptr += 4*4*4; + MemoryUtil.memPutInt(ptr, this.sx); ptr += 4; + MemoryUtil.memPutInt(ptr, this.sy); ptr += 4; + MemoryUtil.memPutInt(ptr, this.sz); ptr += 4; + MemoryUtil.memPutInt(ptr, this.geometry.getSectionCount()); ptr += 4; + var planes = ((AccessFrustumIntersection)this.frustum).getPlanes(); + for (var plane : planes) { + plane.getToAddress(ptr); ptr += 4*4; + } + innerTranslation.getToAddress(ptr); ptr += 4*3; + MemoryUtil.memPutInt(ptr, this.frameId++); ptr += 4; + } + public void renderFarAwayOpaque(MatrixStack stack, double cx, double cy, double cz) { if (this.geometry.getSectionCount() == 0) { return; @@ -144,26 +164,33 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer { RenderLayer.getCutoutMipped().endDrawing(); } - //FIXME: dont do something like this as it breaks multiviewport mods - private int frameId = 0; - private void updateUniformBuffer(MatrixStack stack, double cx, double cy, double cz) { - long ptr = UploadStream.INSTANCE.upload(this.uniformBuffer, 0, this.uniformBuffer.size()); - var mat = new Matrix4f(RenderSystem.getProjectionMatrix()).mul(stack.peek().getPositionMatrix()); - var innerTranslation = new Vector3f((float) (cx-(this.sx<<5)), (float) (cy-(this.sy<<5)), (float) (cz-(this.sz<<5))); - mat.translate(-innerTranslation.x, -innerTranslation.y, -innerTranslation.z); - mat.getToAddress(ptr); ptr += 4*4*4; - MemoryUtil.memPutInt(ptr, this.sx); ptr += 4; - MemoryUtil.memPutInt(ptr, this.sy); ptr += 4; - MemoryUtil.memPutInt(ptr, this.sz); ptr += 4; - MemoryUtil.memPutInt(ptr, this.geometry.getSectionCount()); ptr += 4; - var planes = ((AccessFrustumIntersection)this.frustum).getPlanes(); - for (var plane : planes) { - plane.getToAddress(ptr); ptr += 4*4; - } - innerTranslation.getToAddress(ptr); ptr += 4*3; - MemoryUtil.memPutInt(ptr, this.frameId++); ptr += 4; + @Override + public void renderFarAwayTranslucent() { + RenderLayer.getTranslucent().startDrawing(); + glBindVertexArray(this.vao); + glDisable(GL_CULL_FACE); + + int oldActiveTexture = glGetInteger(GL_ACTIVE_TEXTURE); + int oldBoundTexture = glGetInteger(GL_TEXTURE_BINDING_2D); + + glBindSampler(0, this.models.getSamplerId()); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, this.models.getTextureId()); + this.lodShader.bind(); + + glMultiDrawElementsIndirectCountARB(GL_TRIANGLES, GL_UNSIGNED_SHORT, 400_000 * 4 * 5, 4, this.geometry.getSectionCount(), 0); + + glEnable(GL_CULL_FACE); + glBindVertexArray(0); + + glBindSampler(0, 0); + GL11C.glBindTexture(GL_TEXTURE_2D, oldBoundTexture); + glActiveTexture(oldActiveTexture); + + RenderLayer.getTranslucent().endDrawing(); } + @Override public void shutdown() { super.shutdown(); diff --git a/src/main/resources/assets/zenith/shaders/lod/gl46/cmdgen.comp b/src/main/resources/assets/zenith/shaders/lod/gl46/cmdgen.comp index 3ee62f7b..2224fe4e 100644 --- a/src/main/resources/assets/zenith/shaders/lod/gl46/cmdgen.comp +++ b/src/main/resources/assets/zenith/shaders/lod/gl46/cmdgen.comp @@ -87,7 +87,10 @@ void main() { uint count = 0; //Translucency count = meta.cntA&0xFFFF; - + if (count != 0) { + uint translucentCommandPtr = atomicAdd(translucentDrawCount, 1) + 400000;//FIXME: dont hardcode this offset + writeCmd(translucentCommandPtr, encodedPos, ptr, count); + } ptr += count; //Double sided quads