From a14a558f0d7be28450266ca4ba386e8fcbf05818 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 16 May 2026 15:50:25 -0500 Subject: [PATCH] blaze3D shaders work on both GL and Vulkan --- .../blaze/BlazeDhRenderApiDefinition.java | 13 +++++- .../blaze/apply/BlazeDhApplyRenderer.java | 40 ++++++++++++++++++- .../BlazeDhFarFadeRenderer.java | 6 +++ .../postProcessing/BlazeDhFogRenderer.java | 7 ++++ .../postProcessing/BlazeDhSsaoRenderer.java | 8 +++- .../BlazeVanillaFadeRenderer.java | 5 +++ .../blaze/util/BlazeDhVertexFormatUtil.java | 6 ++- .../openGl/GlDhRenderApiDefinition.java | 3 ++ coreSubProjects | 2 +- gradle.properties | 2 +- 10 files changed, 86 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhRenderApiDefinition.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhRenderApiDefinition.java index 89a3e7ee2..1d87db471 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhRenderApiDefinition.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhRenderApiDefinition.java @@ -13,6 +13,7 @@ import com.seibel.distanthorizons.common.render.blaze.postProcessing.BlazeVanill import com.seibel.distanthorizons.common.render.blaze.test.BlazeDhTestTriangleRenderer; import com.seibel.distanthorizons.common.render.blaze.wrappers.buffer.BlazeVertexBufferWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeLodUniformBufferWrapper; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.EDhRenderDepth; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; @@ -28,7 +29,8 @@ public class BlazeDhRenderApiDefinition extends AbstractDhRenderApiDefinition //=========// //region - public String getApiName() { return "Blaze3D"; } + private final String apiName = "Blaze3D: " + this.getRenderApi();; + public String getApiName() { return this.apiName; } public EDhRenderDepth getRenderDepth() { @@ -39,6 +41,15 @@ public class BlazeDhRenderApiDefinition extends AbstractDhRenderApiDefinition #endif } + public EDhRenderApi getRenderApi() + { + #if MC_VER <= MC_26_1_2 + return EDhRenderApi.OPEN_GL; + #else + return EDhRenderApi.VULKAN; + #endif + } + //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java index 239cb2ac7..1e600a29a 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java @@ -25,6 +25,9 @@ public class BlazeDhApplyRenderer {} #else import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.CommandEncoder; @@ -34,15 +37,23 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.EDhRenderApi; +import com.seibel.distanthorizons.core.util.RenderUtil; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.coreapi.ModInfo; import org.jetbrains.annotations.Nullable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Arrays; import java.util.OptionalDouble; import java.util.OptionalInt; @@ -57,13 +68,17 @@ import java.util.OptionalInt; */ public class BlazeDhApplyRenderer { - public static final DhLogger LOGGER = new DhLoggerBuilder().build(); + public static final DhLogger LOGGER = new DhLoggerBuilder().build(); + + private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); private RenderPipeline pipeline; + private GpuBuffer fragUniformBuffer; + protected GpuBuffer vboGpuBuffer; protected final String name; @@ -179,6 +194,8 @@ public class BlazeDhApplyRenderer pipelineBuilder.withUniformBuffer(uniformName); } + pipelineBuilder.withUniformBuffer("baseFragUniformBlock"); + pipelineBuilder.withSampler("uSourceColorTexture"); pipelineBuilder.withSampler("uSourceDepthTexture"); @@ -225,6 +242,25 @@ public class BlazeDhApplyRenderer this.dummyDepthTextureWrapper.tryCreateOrResize(); + + { + int uniformBufferSize = new Std140SizeCalculator() + .putInt() // uIsVulkan + .get(); + + ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + buffer.order(ByteOrder.nativeOrder()); + buffer = Std140Builder.intoBuffer(buffer) + .putInt((RENDER_API_DEF.getRenderApi() == EDhRenderApi.VULKAN) ? 1 : 0) // uIsVulkan + .get() + ; + + this.fragUniformBuffer = BlazeUniformUtil.createBuffer("baseFragUniformBlock", uniformBufferSize, this.fragUniformBuffer); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); + + COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + } + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getIdentifierName, this.destinationColorTextureViewWrapper.textureView, @@ -247,6 +283,8 @@ public class BlazeDhApplyRenderer renderPass.setUniform(uniformName, uniformBuffer); } + renderPass.setUniform("baseFragUniformBlock", this.fragUniformBuffer); + renderPass.setVertexBuffer(0, this.vboGpuBuffer); renderPass.setPipeline(this.pipeline); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java index ba3e58d42..2b2b1c655 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java @@ -41,11 +41,14 @@ import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBui import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.RenderParams; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFarFadeRenderer; import net.minecraft.client.Minecraft; @@ -63,6 +66,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); + private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); public static final BlazeDhFarFadeRenderer INSTANCE = new BlazeDhFarFadeRenderer(); @@ -161,6 +165,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer .putFloat() // uStartFadeBlockDistance .putFloat() // uEndFadeBlockDistance .putMat4f() // uDhInvMvmProj + .putInt() // uIsVulkan .get(); @@ -188,6 +193,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer .putFloat(fadeStartDistance) // uStartFadeBlockDistance .putFloat(fadeEndDistance) // uEndFadeBlockDistance .putMat4f(inverseDhMvmProjMatrix.createJomlMatrix()) // uDhInvMvmProj + .putInt((RENDER_API_DEF.getRenderApi() == EDhRenderApi.VULKAN) ? 1 : 0) // uIsVulkan .get() ; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java index 693d6da42..ee2b24fa1 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java @@ -37,11 +37,13 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.RenderParams; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFogRenderer; import java.awt.*; @@ -77,6 +79,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); @@ -218,6 +221,8 @@ public class BlazeDhFogRenderer implements IDhFogRenderer .putMat4f() // uInvMvmProj + .putInt() // uIsVulkan + .get(); @@ -312,6 +317,8 @@ public class BlazeDhFogRenderer implements IDhFogRenderer .putMat4f(inverseMvmProjMatrix.createJomlMatrix()) // uInvMvmProj + .putInt((RENDER_API_DEF.getRenderApi() == EDhRenderApi.VULKAN) ? 1 : 0) // uIsVulkan + .get() ; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java index 7555ce4c5..10fbf7616 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java @@ -33,10 +33,12 @@ import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.RenderParams; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhSsaoRenderer; import java.nio.ByteBuffer; @@ -50,7 +52,6 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.BlendFactor; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; @@ -69,6 +70,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer private static final DhLogger LOGGER = new DhLoggerBuilder().build(); private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); @@ -189,6 +191,8 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer .putMat4f() // uInvProj .putMat4f() // uProj + + .putInt() // uIsVulkan .get(); @@ -214,6 +218,8 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer .putMat4f(invertedProjMatrix.createJomlMatrix()) .putMat4f(projMatrix.createJomlMatrix()) + + .putInt((RENDER_API_DEF.getRenderApi() == EDhRenderApi.VULKAN) ? 1 : 0) // uIsVulkan .get() ; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java index b8118add6..4c294b90f 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java @@ -48,10 +48,12 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.RenderParams; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhVanillaFadeRenderer; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; @@ -70,6 +72,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer public static final DhLogger LOGGER = new DhLoggerBuilder().build(); private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + private static final AbstractDhRenderApiDefinition RENDER_API_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); @@ -177,6 +180,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer .putFloat() // uMaxLevelHeight .putMat4f() // uDhInvMvmProj .putMat4f() // uMcInvMvmProj + .putInt() // uIsVulkan .get(); @@ -217,6 +221,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer .putFloat(renderParams.clientLevelWrapper.getMaxHeight()) // uMaxLevelHeight .putMat4f(inverseDhMvmProjMatrix.createJomlMatrix()) // uDhInvMvmProj .putMat4f(inverseMcMvmProjMatrix.createJomlMatrix()) // uMcInvMvmProj + .putInt((RENDER_API_DEF.getRenderApi() == EDhRenderApi.VULKAN) ? 1 : 0) // uIsVulkan .get() ; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java index 146a46c03..5f77690bf 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java @@ -5,7 +5,6 @@ public class BlazeDhVertexFormatUtil {} #else -import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; import com.seibel.distanthorizons.api.enums.config.EDhApiRenderApi; import com.seibel.distanthorizons.core.config.Config; @@ -17,6 +16,11 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import org.jetbrains.annotations.NotNull; +#if MC_VER <= MC_26_1_2 +#else +import com.mojang.blaze3d.GpuFormat; +#endif + /** * @see LodQuadBuilder */ diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java index 4e8474a97..1844a86c3 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/GlDhRenderApiDefinition.java @@ -10,6 +10,7 @@ import com.seibel.distanthorizons.common.render.openGl.postProcessing.fog.GlDhFo import com.seibel.distanthorizons.common.render.openGl.postProcessing.ssao.GlDhSSAORenderer; import com.seibel.distanthorizons.common.render.openGl.terrain.GlDhTerrainShaderProgram; import com.seibel.distanthorizons.common.render.openGl.test.GlTestTriangleRenderer; +import com.seibel.distanthorizons.core.render.EDhRenderApi; import com.seibel.distanthorizons.core.render.EDhRenderDepth; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; @@ -34,6 +35,8 @@ public class GlDhRenderApiDefinition extends AbstractDhRenderApiDefinition return EDhRenderDepth.FORWARD_Z; } + public EDhRenderApi getRenderApi() { return EDhRenderApi.OPEN_GL; } + //endregion diff --git a/coreSubProjects b/coreSubProjects index e07557e6e..f67d9e4e0 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e07557e6e34156ac97ea04526ccad28a416547da +Subproject commit f67d9e4e04d43ca2b768aee4183f56d28e7cccb7 diff --git a/gradle.properties b/gradle.properties index 90fd6504d..31c530cab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=26.2.0 +mcVer=26.1.2 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment minecraftMemoryJavaArg=-Xmx6G