From e4fe0565869c2f419b85a00ec2dd9a20e3880d6c Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:08:49 +1000 Subject: [PATCH] Render basics --- .../me/cortex/voxy/client/core/VoxelCore.java | 3 +- .../client/core/rendering/RenderService.java | 6 +- .../HierarchicalOcclusionTraverser.java | 17 ++++- .../section/AbstractSectionRenderer.java | 1 - .../section/BasicSectionGeometryManager.java | 1 - .../section/MDICSectionRenderer.java | 76 ++++++++++++++----- .../voxy/shaders/lod/gl46/bindings.glsl | 8 +- .../assets/voxy/shaders/lod/gl46/cmdgen.comp | 6 +- .../voxy/shaders/lod/gl46/cull/raster.frag | 1 + .../voxy/shaders/lod/gl46/cull/raster.vert | 9 ++- .../assets/voxy/shaders/lod/gl46/prep.comp | 23 ++++++ .../assets/voxy/shaders/lod/gl46/quads2.vert | 2 +- 12 files changed, 120 insertions(+), 33 deletions(-) create mode 100644 src/main/resources/assets/voxy/shaders/lod/gl46/prep.comp diff --git a/src/main/java/me/cortex/voxy/client/core/VoxelCore.java b/src/main/java/me/cortex/voxy/client/core/VoxelCore.java index 3b2033d7..73b5b904 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxelCore.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxelCore.java @@ -113,7 +113,7 @@ public class VoxelCore { matrices.translate(-cameraX, -cameraY, -cameraZ); matrices.pop(); - var projection = computeProjectionMat(); + var projection = computeProjectionMat();//RenderSystem.getProjectionMatrix(); var viewport = this.renderer.getViewport(); viewport @@ -121,6 +121,7 @@ public class VoxelCore { .setModelView(matrices.peek().getPositionMatrix()) .setCamera(cameraX, cameraY, cameraZ) .setScreenSize(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight); + viewport.frameId++; int boundFB = GL11.glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING); if (boundFB == 0) { diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/RenderService.java b/src/main/java/me/cortex/voxy/client/core/rendering/RenderService.java index b5485d8d..d9388278 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/RenderService.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/RenderService.java @@ -55,8 +55,8 @@ public class RenderService, J extends Vi world.setDirtyCallback(this.nodeManager::sectionUpdate); - for(int x = -10; x<=10;x++) { - for (int z = -10; z <= 10; z++) { + for(int x = -1; x<=1;x++) { + for (int z = -1; z <= 1; z++) { for (int y = -3; y <= 3; y++) { this.renderGen.enqueueTask(0, x, y, z); } @@ -104,7 +104,7 @@ public class RenderService, J extends Vi int depthBuffer = glGetFramebufferAttachmentParameteri(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); this.traversal.doTraversal(viewport, depthBuffer); - this.sectionRenderer.buildDrawCallsAndRenderTemporal(viewport, null); + this.sectionRenderer.buildDrawCallsAndRenderTemporal(viewport, this.traversal.getRenderListBuffer()); } public void renderFarAwayTranslucent(J viewport) { diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java index 63f1b381..d09b395c 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java @@ -22,7 +22,8 @@ public class HierarchicalOcclusionTraverser { private final GlBuffer requestBuffer; private final GlBuffer nodeBuffer; - private final GlBuffer uniformBuffer = new GlBuffer(1024); + private final GlBuffer uniformBuffer = new GlBuffer(1024).zero(); + private final GlBuffer renderList = new GlBuffer(100_000 * 4 + 4).zero();//100k sections max to render private final HiZBuffer hiZBuffer = new HiZBuffer(); @@ -50,6 +51,15 @@ public class HierarchicalOcclusionTraverser { // TODO: swap to persistent gpu thread instead + long uploadPtr = UploadStream.INSTANCE.upload(this.renderList, 0, 1024); + + MemoryUtil.memPutInt(uploadPtr, 1024/4-1); + for (int i = 1; i < 1024/4; i++) { + MemoryUtil.memPutInt(uploadPtr + 4*i, i-1); + } + + UploadStream.INSTANCE.commit(); + this.downloadResetRequestQueue(); } @@ -60,6 +70,10 @@ public class HierarchicalOcclusionTraverser { nglClearNamedBufferSubData(this.requestBuffer.id, GL_R32UI, 0, 4, GL_RED_INTEGER, GL_UNSIGNED_INT, 0); } + public GlBuffer getRenderListBuffer() { + return this.renderList; + } + private void forwardDownloadResult(long ptr, long size) { int count = MemoryUtil.memGetInt(ptr); if (count < 0 || count > 50000) { @@ -81,5 +95,6 @@ public class HierarchicalOcclusionTraverser { this.hiZBuffer.free(); this.nodeBuffer.free(); this.uniformBuffer.free(); + this.renderList.free(); } } diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/section/AbstractSectionRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/section/AbstractSectionRenderer.java index 1b885f64..6fb8e5ec 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/section/AbstractSectionRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/section/AbstractSectionRenderer.java @@ -4,7 +4,6 @@ package me.cortex.voxy.client.core.rendering.section; import me.cortex.voxy.client.core.gl.GlBuffer; import me.cortex.voxy.client.core.model.ModelStore; import me.cortex.voxy.client.core.rendering.Viewport; -import me.cortex.voxy.client.core.rendering.geometry.OLD.AbstractGeometryManager; import java.util.List; diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/section/BasicSectionGeometryManager.java b/src/main/java/me/cortex/voxy/client/core/rendering/section/BasicSectionGeometryManager.java index 957294e1..fdd92170 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/section/BasicSectionGeometryManager.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/section/BasicSectionGeometryManager.java @@ -5,7 +5,6 @@ import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import me.cortex.voxy.client.core.gl.GlBuffer; import me.cortex.voxy.client.core.rendering.building.BuiltSection; -import me.cortex.voxy.client.core.rendering.geometry.OLD.DefaultGeometryManager; import me.cortex.voxy.client.core.rendering.util.BufferArena; import me.cortex.voxy.client.core.rendering.util.UploadStream; import me.cortex.voxy.common.util.HierarchicalBitSet; 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 6336fa40..6fc5864b 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 @@ -8,11 +8,7 @@ import me.cortex.voxy.client.core.model.ModelStore; import me.cortex.voxy.client.core.rendering.LightMapHelper; import me.cortex.voxy.client.core.rendering.RenderService; import me.cortex.voxy.client.core.rendering.SharedIndexBuffer; -import me.cortex.voxy.client.core.rendering.geometry.OLD.AbstractFarWorldRenderer; -import me.cortex.voxy.client.core.rendering.geometry.OLD.AbstractGeometryManager; -import me.cortex.voxy.client.core.rendering.geometry.OLD.Gl46HierarchicalViewport; import me.cortex.voxy.client.core.rendering.util.UploadStream; -import me.cortex.voxy.client.mixin.joml.AccessFrustumIntersection; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.math.MathHelper; import org.joml.Matrix4f; @@ -29,12 +25,11 @@ import static org.lwjgl.opengl.GL15.glBindBuffer; import static org.lwjgl.opengl.GL30.glBindBufferBase; import static org.lwjgl.opengl.GL30.glBindVertexArray; import static org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER; -import static org.lwjgl.opengl.GL32.glDrawElementsInstancedBaseVertex; import static org.lwjgl.opengl.GL33.glBindSampler; import static org.lwjgl.opengl.GL40C.GL_DRAW_INDIRECT_BUFFER; -import static org.lwjgl.opengl.GL42.glDrawElementsInstancedBaseVertexBaseInstance; import static org.lwjgl.opengl.GL43.*; import static org.lwjgl.opengl.GL45.glBindTextureUnit; +import static org.lwjgl.opengl.GL45.glCopyNamedBufferSubData; //Uses MDIC to render the sections public class MDICSectionRenderer extends AbstractSectionRenderer { @@ -43,14 +38,23 @@ public class MDICSectionRenderer extends AbstractSectionRenderer layout(early_fragment_tests) in; diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert b/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert index 28cdb5a8..532bd16d 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert @@ -1,6 +1,11 @@ #version 460 core #extension GL_ARB_gpu_shader_int64 : enable #define VISIBILITY_ACCESS writeonly + +#define SECTION_METADATA_BUFFER_BINDING 1 +#define VISIBILITY_BUFFER_BINDING 2 +#define INDIRECT_SECTION_LOOKUP_BINDING 3 + #import #import @@ -8,7 +13,7 @@ flat out uint id; flat out uint value; void main() { - uint sid = gl_InstanceID; + uint sid = indirectLookup[gl_InstanceID]; SectionMeta section = sectionData[sid]; @@ -25,6 +30,6 @@ void main() { gl_Position = MVP * vec4(vec3(pos),1); //Write to this id - id = sid; + id = gl_InstanceID;//Note!! we write to the instance id _not_ the section id value = frameId; } \ No newline at end of file diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/prep.comp b/src/main/resources/assets/voxy/shaders/lod/gl46/prep.comp new file mode 100644 index 00000000..0b5be2af --- /dev/null +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/prep.comp @@ -0,0 +1,23 @@ +#version 450 + +layout(local_size_x = 1) in; + +#define DRAW_COUNT_BUFFER_BINDING 1 +#define INDIRECT_SECTION_LOOKUP_BINDING 2 + +#import + +void main() { + cmdGenDispatchX = ((sectionCount+127)/128); + cmdGenDispatchY = 1; + cmdGenDispatchZ = 1; + + opaqueDrawCount = 0; + translucentDrawCount = 0; + + cullDrawIndirectCommand.count = 6*2*3; + cullDrawIndirectCommand.instanceCount = sectionCount; + cullDrawIndirectCommand.firstIndex = (1<<16)*6*2; + cullDrawIndirectCommand.baseVertex = 0; + cullDrawIndirectCommand.baseInstance = 0; +} \ No newline at end of file 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 643e446f..adeefe73 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert @@ -2,7 +2,7 @@ #extension GL_ARB_gpu_shader_int64 : enable #define QUAD_BUFFER_BINDING 1 -#define SECTION_METADA_BUFFER_BINDING 2 +#define SECTION_METADATA_BUFFER_BINDING 2 #define MODEL_BUFFER_BINDING 3 #define MODEL_COLOUR_BUFFER_BINDING 4 #define LIGHTING_BUFFER_BINDING 5