From 84a32581b76cd80b74ef82543f5c9e7455d4d0a6 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Fri, 2 May 2025 16:12:47 +1000 Subject: [PATCH] Attempted improvements for outline performance --- .../client/core/rendering/ChunkBoundRenderer.java | 14 ++++++++++++-- .../assets/voxy/shaders/chunkoutline/outline.vsh | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java index 31ce07d6..506113d5 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java @@ -26,6 +26,7 @@ import static org.lwjgl.opengl.GL30.glBindVertexArray; import static org.lwjgl.opengl.GL30C.*; import static org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER; import static org.lwjgl.opengl.GL31.glDrawElementsInstanced; +import static org.lwjgl.opengl.GL42.glDrawElementsInstancedBaseInstance; import static org.lwjgl.opengl.GL45.glClearNamedFramebufferfv; //This is a render subsystem, its very simple in what it does @@ -134,10 +135,19 @@ public class ChunkBoundRenderer { glBindFramebuffer(GL_FRAMEBUFFER, this.frameBuffer.id); this.rasterShader.bind(); glBindBufferBase(GL_UNIFORM_BUFFER, 0, this.uniformBuffer.id); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, SharedIndexBuffer.INSTANCE.id()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, SharedIndexBuffer.INSTANCE_BYTE.id()); //TODO: BATCH with multiple cubes per instance, this helps fill the pipe and should greatly improve performance of this - glDrawElementsInstanced(GL_TRIANGLES, 6*2*3, GL_UNSIGNED_BYTE, SharedIndexBuffer.CUBE_INDEX_OFFSET, this.chunk2idx.size()); + int count = this.chunk2idx.size(); + int i = 0; + if (count/32 > 0) { + glDrawElementsInstanced(GL_TRIANGLES, 6 * 2 * 3 * 32, GL_UNSIGNED_BYTE, SharedIndexBuffer.CUBE_INDEX_OFFSET, count/32); + i = (count/32)*32; + count -= i; + } + if (count > 0) { + glDrawElementsInstancedBaseInstance(GL_TRIANGLES, 6 * 2 * 3 * count, GL_UNSIGNED_BYTE, SharedIndexBuffer.CUBE_INDEX_OFFSET, 1, i); + } { glFrontFace(GL_CCW);//Restore winding order diff --git a/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh b/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh index 81dbd780..e8d61f9a 100644 --- a/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh +++ b/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh @@ -11,7 +11,9 @@ layout(binding = 1, std430) restrict readonly buffer ChunkPosBuffer { }; void main() { - ivec3 origin = ivec3(chunkPos[gl_InstanceID], 0).xzy; + uint id = gl_InstanceID+gl_BaseInstance+(gl_VertexID>>3); + + ivec3 origin = ivec3(chunkPos[id], 0).xzy; origin -= section.xyz; ivec3 cubeCornerI = ivec3(gl_VertexID&1, (gl_VertexID>>2)&1, (gl_VertexID>>1)&1);