diff --git a/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java b/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java index 46ea255b..891ed843 100644 --- a/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java @@ -58,17 +58,20 @@ public abstract class AbstractRenderPipeline extends TrackedObject { public final DepthFramebuffer fb = new DepthFramebuffer(GL_DEPTH24_STENCIL8); + protected final boolean deferTranslucency; + private static final int DEPTH_SAMPLER = glGenSamplers(); static { glSamplerParameteri(DEPTH_SAMPLER, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glSamplerParameteri(DEPTH_SAMPLER, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } - protected AbstractRenderPipeline(AsyncNodeManager nodeManager, NodeCleaner nodeCleaner, HierarchicalOcclusionTraverser traversal, BooleanSupplier frexSupplier) { + protected AbstractRenderPipeline(AsyncNodeManager nodeManager, NodeCleaner nodeCleaner, HierarchicalOcclusionTraverser traversal, BooleanSupplier frexSupplier, boolean deferTranslucency) { this.frexStillHasWork = frexSupplier; this.nodeManager = nodeManager; this.nodeCleaner = nodeCleaner; this.traversal = traversal; + this.deferTranslucency = deferTranslucency; } //Allows pipelines to configure model baking system @@ -107,7 +110,9 @@ public abstract class AbstractRenderPipeline extends TrackedObject { this.postOpaquePreTranslucent(viewport); - rs.renderTranslucent(viewport); + if (!this.deferTranslucency) { + rs.renderTranslucent(viewport); + } this.finish(viewport, sourceFrameBuffer, srcWidth, srcHeight); glBindFramebuffer(GL_FRAMEBUFFER, sourceFrameBuffer); diff --git a/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java b/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java index c095510d..9ef672fc 100644 --- a/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java @@ -31,7 +31,7 @@ public class IrisVoxyRenderPipeline extends AbstractRenderPipeline { private final GlBuffer shaderUniforms; public IrisVoxyRenderPipeline(IrisVoxyRenderPipelineData data, AsyncNodeManager nodeManager, NodeCleaner nodeCleaner, HierarchicalOcclusionTraverser traversal, BooleanSupplier frexSupplier) { - super(nodeManager, nodeCleaner, traversal, frexSupplier); + super(nodeManager, nodeCleaner, traversal, frexSupplier, data.shouldDeferTranslucency()); this.data = data; if (this.data.thePipeline != null) { throw new IllegalStateException("Pipeline data already bound"); diff --git a/src/main/java/me/cortex/voxy/client/core/NormalRenderPipeline.java b/src/main/java/me/cortex/voxy/client/core/NormalRenderPipeline.java index ac4e980e..a6c98d01 100644 --- a/src/main/java/me/cortex/voxy/client/core/NormalRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/NormalRenderPipeline.java @@ -46,7 +46,7 @@ public class NormalRenderPipeline extends AbstractRenderPipeline { .compile(); protected NormalRenderPipeline(AsyncNodeManager nodeManager, NodeCleaner nodeCleaner, HierarchicalOcclusionTraverser traversal, BooleanSupplier frexSupplier) { - super(nodeManager, nodeCleaner, traversal, frexSupplier); + super(nodeManager, nodeCleaner, traversal, frexSupplier, false); this.useEnvFog = VoxyConfig.CONFIG.useEnvironmentalFog; this.finalBlit = new FullscreenBlit("voxy:post/blit_texture_depth_cutout.frag", a->a.defineIf("USE_ENV_FOG", this.useEnvFog).define("EMIT_COLOUR")); diff --git a/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java b/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java index 2605810a..3fc94112 100644 --- a/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java +++ b/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java @@ -26,7 +26,6 @@ public class IrisShaderPatch { public static final boolean IMPERSONATE_DISTANT_HORIZONS = System.getProperty("voxy.impersonateDHShader", "false").equalsIgnoreCase("true"); - private static final class SSBODeserializer implements JsonDeserializer> { @Override public Int2ObjectOpenHashMap deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { @@ -176,6 +175,7 @@ public class IrisShaderPatch { public boolean excludeLodsFromVanillaDepth; public float[] renderScale; public boolean useViewportDims; + //public boolean deferTranslucentRendering; public String checkValid() { if (this.blending != null) { int i = 0; @@ -268,6 +268,10 @@ public class IrisShaderPatch { return new float[]{Math.max(0.01f,this.patchData.renderScale[0]),Math.max(0.01f,this.patchData.renderScale[1])}; } + public boolean deferedTranslucentRendering() { + return false;//this.patchData.deferTranslucentRendering; + } + public Runnable createBlendSetup() { if (this.patchData.blending == null || this.patchData.blending.isEmpty()) { return ()->{};//No blending change diff --git a/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java b/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java index dd9875f7..79f0eca5 100644 --- a/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java +++ b/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java @@ -51,6 +51,7 @@ public class IrisVoxyRenderPipelineData { public final float[] resolutionScale; public final String TAA; public final boolean useViewportDims; + public final boolean deferTranslucency; private IrisVoxyRenderPipelineData(IrisShaderPatch patch, int[] opaqueDrawTargets, int[] translucentDrawTargets, StructLayout uniformSet, Runnable blendingSetup, ImageSet imageSet, SSBOSet ssboSet) { this.opaqueDrawTargets = opaqueDrawTargets; @@ -65,6 +66,7 @@ public class IrisVoxyRenderPipelineData { this.TAA = patch.getTAAShift(); this.resolutionScale = patch.getRenderScale(); this.useViewportDims = patch.useViewportDims(); + this.deferTranslucency = patch.deferedTranslucentRendering(); } public SSBOSet getSsboSet() { @@ -92,6 +94,7 @@ public class IrisVoxyRenderPipelineData { public static IrisVoxyRenderPipelineData buildPipeline(IrisRenderingPipeline ipipe, IrisShaderPatch patch, CustomUniforms cu, ShaderStorageBufferHolder ssboHolder) { var uniforms = createUniformLayoutStructAndUpdater(createUniformSet(cu, patch)); + var imageSet = createImageSet(ipipe, patch); var ssboSet = createSSBOLayouts(patch.getSSBOs(), ssboHolder); @@ -130,6 +133,11 @@ public class IrisVoxyRenderPipelineData { case VEC4I -> "ivec4"; }; } + + public boolean shouldDeferTranslucency() { + return false; + } + public record StructLayout(int size, String layout, LongConsumer updater) {} private static StructLayout createUniformLayoutStructAndUpdater(List uniforms) { if (uniforms.size() == 0) {