From b885d7c1ec1763d0884113d005dc33aa41b8e492 Mon Sep 17 00:00:00 2001 From: mcrcortex <{ID}+{username}@users.noreply.github.com> Date: Thu, 9 May 2024 21:46:42 +1000 Subject: [PATCH] Size 62 meshlets + major fix for hiz culling --- .../voxy/client/core/gl/shader/Shader.java | 28 ++++++++++++++++++- .../Gl46MeshletsFarWorldRenderer.java | 16 ++++++++--- .../rendering/building/RenderDataFactory.java | 2 +- .../voxy/shaders/lod/gl46mesh/bindings.glsl | 2 +- .../voxy/shaders/lod/gl46mesh/meshlet.glsl | 2 -- .../shaders/lod/gl46mesh/meshletculler.comp | 11 +++++--- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/gl/shader/Shader.java b/src/main/java/me/cortex/voxy/client/core/gl/shader/Shader.java index a3f3814d..63d215b5 100644 --- a/src/main/java/me/cortex/voxy/client/core/gl/shader/Shader.java +++ b/src/main/java/me/cortex/voxy/client/core/gl/shader/Shader.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL20C; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import static org.lwjgl.opengl.GL20.glDeleteProgram; import static org.lwjgl.opengl.GL20.glUseProgram; @@ -37,12 +38,23 @@ public class Shader extends TrackedObject { } public static class Builder { + private final Map defines = new HashMap<>(); private final Map sources = new HashMap<>(); private final IShaderProcessor processor; private Builder(IShaderProcessor processor) { this.processor = processor; } + public Builder define(String name) { + this.defines.put(name, ""); + return this; + } + + public Builder define(String name, int value) { + this.defines.put(name, Integer.toString(value)); + return this; + } + public Builder add(ShaderType type, String id) { this.addSource(type, ShaderLoader.parse(id)); return this; @@ -55,7 +67,21 @@ public class Shader extends TrackedObject { public Shader compile() { int program = GL20C.glCreateProgram(); - int[] shaders = this.sources.entrySet().stream().mapToInt(a->createShader(a.getKey(), a.getValue())).toArray(); + int[] shaders = new int[this.sources.size()]; + { + String defs = this.defines.entrySet().stream().map(a->"#define " + a.getKey() + " " + a.getValue() + "\n").collect(Collectors.joining()); + int i = 0; + for (var entry : this.sources.entrySet()) { + String src = entry.getValue(); + + //Inject defines + src = src.substring(0, src.indexOf('\n')+1) + + defs + + src.substring(src.indexOf('\n')+1); + + shaders[i++] = createShader(entry.getKey(), src); + } + } for (int i : shaders) { GL20C.glAttachShader(program, i); diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java index 35f0ccc9..03efe9dc 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java @@ -3,6 +3,7 @@ package me.cortex.voxy.client.core.rendering; import me.cortex.voxy.client.core.gl.GlBuffer; import me.cortex.voxy.client.core.gl.shader.Shader; import me.cortex.voxy.client.core.gl.shader.ShaderType; +import me.cortex.voxy.client.core.rendering.building.RenderDataFactory; import me.cortex.voxy.client.core.rendering.util.UploadStream; import me.cortex.voxy.client.mixin.joml.AccessFrustumIntersection; import net.minecraft.client.MinecraftClient; @@ -44,20 +45,24 @@ import static org.lwjgl.opengl.NVRepresentativeFragmentTest.GL_REPRESENTATIVE_FR // this could potentially result in a fair bit of memory savings (especially if used in normal mc terrain rendering) public class Gl46MeshletsFarWorldRenderer extends AbstractFarWorldRenderer { private final Shader lodShader = Shader.make() + .define("QUADS_PER_MESHLET", RenderDataFactory.QUADS_PER_MESHLET) .add(ShaderType.VERTEX, "voxy:lod/gl46mesh/quads.vert") .add(ShaderType.FRAGMENT, "voxy:lod/gl46mesh/quads.frag") .compile(); private final Shader cullShader = Shader.make() + .define("QUADS_PER_MESHLET", RenderDataFactory.QUADS_PER_MESHLET) .add(ShaderType.VERTEX, "voxy:lod/gl46mesh/cull.vert") .add(ShaderType.FRAGMENT, "voxy:lod/gl46mesh/cull.frag") .compile(); private final Shader meshletGenerator = Shader.make() + .define("QUADS_PER_MESHLET", RenderDataFactory.QUADS_PER_MESHLET) .add(ShaderType.COMPUTE, "voxy:lod/gl46mesh/cmdgen.comp") .compile(); private final Shader meshletCuller = Shader.make() + .define("QUADS_PER_MESHLET", RenderDataFactory.QUADS_PER_MESHLET) .add(ShaderType.COMPUTE, "voxy:lod/gl46mesh/meshletculler.comp") .compile(); @@ -67,15 +72,19 @@ public class Gl46MeshletsFarWorldRenderer extends AbstractFarWorldRenderer 0.0001; }