From 75a9df969bd904cf6242f0f0284f2a0a216668c1 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:51:42 +1000 Subject: [PATCH] Support render scaling factor in shaders --- .../voxy/client/core/AbstractRenderPipeline.java | 3 +++ .../voxy/client/core/IrisVoxyRenderPipeline.java | 7 ++++++- .../me/cortex/voxy/client/core/VoxyRenderSystem.java | 8 ++++++++ .../me/cortex/voxy/client/iris/IrisShaderPatch.java | 11 +++++++++++ .../voxy/client/iris/IrisVoxyRenderPipelineData.java | 8 +++----- 5 files changed, 31 insertions(+), 6 deletions(-) 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 9ba5d7bc..3dc9b056 100644 --- a/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java @@ -215,4 +215,7 @@ public abstract class AbstractRenderPipeline extends TrackedObject { return null; } + //Null means no scaling factor + public float[] getRenderScalingFactor() {return null;} + } 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 4ab8e5a0..d23121d6 100644 --- a/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/IrisVoxyRenderPipeline.java @@ -227,8 +227,13 @@ public class IrisVoxyRenderPipeline extends AbstractRenderPipeline { } builder.append("vec2 ").append(functionName).append("()\n"); - builder.append(this.data.getTAAOffset()); + builder.append(this.data.TAA); builder.append("\n"); return builder.toString(); } + + @Override + public float[] getRenderScalingFactor() { + return this.data.resolutionScale; + } } diff --git a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java index ede4b575..bad3eab8 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java @@ -174,6 +174,14 @@ public class VoxyRenderSystem { int width = dims[2]; int height = dims[3]; + {//Apply render scaling factor + var factor = this.pipeline.getRenderScalingFactor(); + if (factor != null) { + width = (int) (width*factor[0]); + height = (int) (height*factor[1]); + } + } + viewport .setVanillaProjection(matrices.projection()) .setProjection(projection) 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 c164fc87..a1c8e451 100644 --- a/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java +++ b/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java @@ -156,6 +156,7 @@ public class IrisShaderPatch { public Int2ObjectOpenHashMap blending; public String taaOffset; public boolean excludeLodsFromVanillaDepth; + public float[] renderScale; public boolean checkValid() { return this.opaqueDrawBuffers != null && this.translucentDrawBuffers != null && this.uniforms != null && this.opaquePatchData != null; } @@ -209,6 +210,16 @@ public class IrisShaderPatch { return !this.patchData.excludeLodsFromVanillaDepth; } + public float[] getRenderScale() { + if (this.patchData.renderScale == null || this.patchData.renderScale.length==0) { + return new float[]{1,1}; + } + if (this.patchData.renderScale.length == 1) { + return new float[]{this.patchData.renderScale[0],this.patchData.renderScale[0]}; + } + return new float[]{Math.max(0.01f,this.patchData.renderScale[0]),Math.max(0.01f,this.patchData.renderScale[1])}; + } + 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 6f0c0b0a..50435f0d 100644 --- a/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java +++ b/src/main/java/me/cortex/voxy/client/iris/IrisVoxyRenderPipelineData.java @@ -47,7 +47,8 @@ public class IrisVoxyRenderPipelineData { private final ImageSet imageSet; private final SSBOSet ssboSet; public final boolean renderToVanillaDepth; - private final String TAA; + public final float[] resolutionScale; + public final String TAA; private IrisVoxyRenderPipelineData(IrisShaderPatch patch, int[] opaqueDrawTargets, int[] translucentDrawTargets, StructLayout uniformSet, Runnable blendingSetup, ImageSet imageSet, SSBOSet ssboSet) { this.opaqueDrawTargets = opaqueDrawTargets; this.translucentDrawTargets = translucentDrawTargets; @@ -59,6 +60,7 @@ public class IrisVoxyRenderPipelineData { this.ssboSet = ssboSet; this.renderToVanillaDepth = patch.emitToVanillaDepth(); this.TAA = patch.getTAAShift(); + this.resolutionScale = patch.getRenderScale(); } public SSBOSet getSsboSet() { @@ -109,10 +111,6 @@ public class IrisVoxyRenderPipelineData { return targetTextures; } - public String getTAAOffset() { - return this.TAA; - } - public record StructLayout(int size, String layout, LongConsumer updater) {} private static StructLayout createUniformLayoutStructAndUpdater(CachedUniform[] uniforms) { if (uniforms.length == 0) {