From 4cebe5756bb5a3fffe2f054a6351ee41db945cd9 Mon Sep 17 00:00:00 2001 From: Ocelot Date: Sat, 11 Jan 2025 17:21:04 -0700 Subject: [PATCH] Full screen rendering now uses a large triangle --- .../api/client/render/VeilRenderSystem.java | 29 ++----- .../render/post/stage/BlitPostStage.java | 5 +- .../api/client/render/shader/VeilShaders.java | 6 +- .../ext/PerformanceRenderTargetExtension.java | 9 ++ .../impl/client/editor/DeviceInfoViewer.java | 1 + .../impl/client/editor/ShaderInspector.java | 2 +- .../impl/client/editor/TextureInspector.java | 2 +- .../client/LevelRendererMixin.java | 27 ++++++ .../PerformanceScreenEffectRendererMixin.java | 6 +- .../performance/client/RenderTargetMixin.java | 87 +++++++++++++++++-- .../client/PipelineRenderTargetMixin.java | 3 - .../resources/assets/veil/lang/en_us.json | 1 + .../shaders/include/space_helper.glsl | 28 ++++++ .../pinwheel/shaders/program/blit_screen.fsh | 4 +- .../pinwheel/shaders/program/blit_screen.vsh | 10 +-- .../pinwheel/shaders/program/space_test.fsh | 2 +- .../resources/veil.performance.mixins.json | 1 + 17 files changed, 172 insertions(+), 51 deletions(-) create mode 100644 common/src/main/java/foundry/veil/ext/PerformanceRenderTargetExtension.java create mode 100644 common/src/main/java/foundry/veil/mixin/performance/client/LevelRendererMixin.java diff --git a/common/src/main/java/foundry/veil/api/client/render/VeilRenderSystem.java b/common/src/main/java/foundry/veil/api/client/render/VeilRenderSystem.java index d3bbc2f19..a3dc1f8c0 100644 --- a/common/src/main/java/foundry/veil/api/client/render/VeilRenderSystem.java +++ b/common/src/main/java/foundry/veil/api/client/render/VeilRenderSystem.java @@ -83,6 +83,7 @@ public final class VeilRenderSystem { private static final BooleanSupplier SPARSE_BUFFERS_SUPPORTED = glCapability(caps -> caps.OpenGL44 || caps.GL_ARB_sparse_buffer); private static final BooleanSupplier DIRECT_STATE_ACCESS_SUPPORTED = glCapability(caps -> caps.OpenGL45 || caps.GL_ARB_direct_state_access); private static final BooleanSupplier CLEAR_TEXTURE_SUPPORTED = glCapability(caps -> caps.OpenGL44 || caps.GL_ARB_clear_texture); + private static final BooleanSupplier COPY_IMAGE_SUPPORTED = glCapability(caps -> caps.OpenGL43 || caps.GL_ARB_copy_image); private static final BooleanSupplier SHADER_STORAGE_BLOCK_SUPPORTED = VeilRenderSystem.glCapability(caps -> caps.OpenGL43 || caps.GL_ARB_shader_storage_buffer_object); private static final BooleanSupplier PROGRAM_INTERFACE_QUERY_SUPPORTED = VeilRenderSystem.glCapability(caps -> caps.OpenGL43 || caps.GL_ARB_program_interface_query); private static final IntSupplier MAX_COMBINED_TEXTURE_IMAGE_UNITS = VeilRenderSystem.glGetter(() -> glGetInteger(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS)); @@ -217,7 +218,6 @@ public final class VeilRenderSystem { private static VeilRenderer renderer; private static ResourceLocation shaderLocation; - private static VertexArray screenQuad; private VeilRenderSystem() { } @@ -302,16 +302,6 @@ public static void init() { renderer = new VeilRenderer(resourceManager, client.getWindow()); VeilImGuiImpl.init(client.getWindow().getWindow()); - - BufferBuilder bufferBuilder = RenderSystem.renderThreadTesselator().begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION); - bufferBuilder.addVertex(-1, 1, 0); - bufferBuilder.addVertex(-1, -1, 0); - bufferBuilder.addVertex(1, 1, 0); - bufferBuilder.addVertex(1, -1, 0); - - screenQuad = VertexArray.create(); - screenQuad.upload(bufferBuilder.buildOrThrow(), VertexArray.DrawUsage.STATIC); - VertexBuffer.unbind(); } /** @@ -334,15 +324,6 @@ public static void bindTextures(int first, int... textures) { VeilTextureMultiBind.get().bindTextures(first, textures); } - /** - * Draws a quad onto the full screen using {@link DefaultVertexFormat#POSITION}. - */ - public static void drawScreenQuad() { - screenQuad.bind(); - screenQuad.draw(GL_TRIANGLE_STRIP); - VertexBuffer.unbind(); - } - /** * Sets the shader instance to be a reference to the shader manager. * @@ -525,6 +506,13 @@ public static boolean clearTextureSupported() { return VeilRenderSystem.CLEAR_TEXTURE_SUPPORTED.getAsBoolean(); } + /** + * @return Whether {@link ARBCopyImage} is supported + */ + public static boolean copyImageSupported() { + return VeilRenderSystem.COPY_IMAGE_SUPPORTED.getAsBoolean(); + } + /** * @return Whether {@link ARBShaderStorageBufferObject} is supported */ @@ -910,7 +898,6 @@ public static void close() { if (renderer != null) { renderer.free(); } - screenQuad.close(); SHADER_BUFFER_CACHE.free(); } diff --git a/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java b/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java index c19153769..4892802ea 100644 --- a/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java +++ b/common/src/main/java/foundry/veil/api/client/render/post/stage/BlitPostStage.java @@ -22,6 +22,9 @@ import java.util.Map; import java.util.Optional; +import static org.lwjgl.opengl.GL11C.GL_TRIANGLE_STRIP; +import static org.lwjgl.opengl.GL11C.glDrawArrays; + /** * A basic stage that draws a quad to the output using a specified shader. * @@ -82,7 +85,7 @@ public void apply(Context context) { for (Map.Entry entry : this.uniforms.entrySet()) { entry.getValue().apply(entry.getKey(), shader); } - VeilRenderSystem.drawScreenQuad(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); context.clearSamplers(shader); } diff --git a/common/src/main/java/foundry/veil/api/client/render/shader/VeilShaders.java b/common/src/main/java/foundry/veil/api/client/render/shader/VeilShaders.java index e89b8e612..176c95543 100644 --- a/common/src/main/java/foundry/veil/api/client/render/shader/VeilShaders.java +++ b/common/src/main/java/foundry/veil/api/client/render/shader/VeilShaders.java @@ -12,20 +12,18 @@ private VeilShaders() { } public static final ResourceLocation PARTICLE = quasar("particle"); - public static final ResourceLocation PARTICLE_ADD = quasar("particle_add"); - public static final ResourceLocation LIGHT_AMBIENT = light("ambient"); public static final ResourceLocation LIGHT_DIRECTIONAL = light("directional"); public static final ResourceLocation LIGHT_POINT = light("point"); public static final ResourceLocation LIGHT_AREA = light("area"); - public static final ResourceLocation LIGHT_VANILLA_LIGHTMAP = light("vanilla_lightmap"); - public static final ResourceLocation LIGHT_SKY = light("sky"); public static final ResourceLocation LIGHT_INDIRECT_SPHERE = light("indirect_sphere"); public static final ResourceLocation SKINNED_MESH = necromancer("skinned_mesh"); public static final ResourceLocation DEBUG_CUBEMAP = debug("cubemap"); + public static final ResourceLocation BLIT_SCREEN = Veil.veilPath("blit_screen"); + private static ResourceLocation quasar(String name) { return Veil.veilPath("quasar/" + name); } diff --git a/common/src/main/java/foundry/veil/ext/PerformanceRenderTargetExtension.java b/common/src/main/java/foundry/veil/ext/PerformanceRenderTargetExtension.java new file mode 100644 index 000000000..e08d7f2a2 --- /dev/null +++ b/common/src/main/java/foundry/veil/ext/PerformanceRenderTargetExtension.java @@ -0,0 +1,9 @@ +package foundry.veil.ext; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface PerformanceRenderTargetExtension { + + void veil$clearColorBuffer(boolean clearError); +} diff --git a/common/src/main/java/foundry/veil/impl/client/editor/DeviceInfoViewer.java b/common/src/main/java/foundry/veil/impl/client/editor/DeviceInfoViewer.java index c5a821d1c..d97d1561e 100644 --- a/common/src/main/java/foundry/veil/impl/client/editor/DeviceInfoViewer.java +++ b/common/src/main/java/foundry/veil/impl/client/editor/DeviceInfoViewer.java @@ -117,6 +117,7 @@ private void renderOpenGL() { flagText("inspector.veil.device_info.opengl.feature_flag.sparse_buffers", VeilRenderSystem.sparseBuffersSupported(), "Whether sparse buffers can be used"); flagText("inspector.veil.device_info.opengl.feature_flag.direct_state_access", VeilRenderSystem.directStateAccessSupported(), "Whether direct state accesss can be used"); flagText("inspector.veil.device_info.opengl.feature_flag.clear_texture", VeilRenderSystem.clearTextureSupported(), "Whether glClearTexImage can be used"); + flagText("inspector.veil.device_info.opengl.feature_flag.copy_image", VeilRenderSystem.copyImageSupported(), "Whether glCopyImageSubData can be used"); flagText("inspector.veil.device_info.opengl.feature_flag.shader_storage_buffers", VeilRenderSystem.shaderStorageBufferSupported(), "Whether shader storage buffers can be used"); flagText("inspector.veil.device_info.opengl.feature_flag.program_interface_query", VeilRenderSystem.programInterfaceQuerySupported(), "Whether the new style program interface query can be used"); ImGui.separator(); diff --git a/common/src/main/java/foundry/veil/impl/client/editor/ShaderInspector.java b/common/src/main/java/foundry/veil/impl/client/editor/ShaderInspector.java index 3c24c5d66..3536c97d8 100644 --- a/common/src/main/java/foundry/veil/impl/client/editor/ShaderInspector.java +++ b/common/src/main/java/foundry/veil/impl/client/editor/ShaderInspector.java @@ -318,7 +318,7 @@ public void render() { if (ImGui.collapsingHeader(SAMPLERS.getString(), ImGuiTreeNodeFlags.DefaultOpen) && !invalid) { ImGui.indent(); for (CharSequence sampler : this.uniformCache.getSamplers()) { - ImGui.selectable(sampler.toString()); + ImGui.selectable(sampler + ": " + glGetUniformi(program, Objects.requireNonNull(this.uniformCache.getUniform(sampler)).location())); } ImGui.unindent(); } diff --git a/common/src/main/java/foundry/veil/impl/client/editor/TextureInspector.java b/common/src/main/java/foundry/veil/impl/client/editor/TextureInspector.java index 6c3034392..5ae39d26a 100644 --- a/common/src/main/java/foundry/veil/impl/client/editor/TextureInspector.java +++ b/common/src/main/java/foundry/veil/impl/client/editor/TextureInspector.java @@ -309,7 +309,7 @@ public void render(int width, int height) { this.fbo.clear(); glBindTexture(GL_TEXTURE_CUBE_MAP, this.texture); shaderProgram.bind(); - VeilRenderSystem.drawScreenQuad(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); AdvancedFbo.unbind(); } diff --git a/common/src/main/java/foundry/veil/mixin/performance/client/LevelRendererMixin.java b/common/src/main/java/foundry/veil/mixin/performance/client/LevelRendererMixin.java new file mode 100644 index 000000000..9d93536c4 --- /dev/null +++ b/common/src/main/java/foundry/veil/mixin/performance/client/LevelRendererMixin.java @@ -0,0 +1,27 @@ +package foundry.veil.mixin.performance.client; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import foundry.veil.ext.PerformanceRenderTargetExtension; +import net.minecraft.client.renderer.LevelRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LevelRenderer.class) +public class LevelRendererMixin { + + @Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/pipeline/RenderTarget;clear(Z)V", ordinal = 0)) + public void clearItemEntityDepth(RenderTarget instance, boolean clearError) { + ((PerformanceRenderTargetExtension) instance).veil$clearColorBuffer(clearError); + } + + @Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/pipeline/RenderTarget;clear(Z)V", ordinal = 3)) + public void clearTranslucentDepth(RenderTarget instance, boolean clearError) { + ((PerformanceRenderTargetExtension) instance).veil$clearColorBuffer(clearError); + } + + @Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/pipeline/RenderTarget;clear(Z)V", ordinal = 4)) + public void clearParticlesDepth(RenderTarget instance, boolean clearError) { + ((PerformanceRenderTargetExtension) instance).veil$clearColorBuffer(clearError); + } +} diff --git a/common/src/main/java/foundry/veil/mixin/performance/client/PerformanceScreenEffectRendererMixin.java b/common/src/main/java/foundry/veil/mixin/performance/client/PerformanceScreenEffectRendererMixin.java index c528a36a4..ca17a089a 100644 --- a/common/src/main/java/foundry/veil/mixin/performance/client/PerformanceScreenEffectRendererMixin.java +++ b/common/src/main/java/foundry/veil/mixin/performance/client/PerformanceScreenEffectRendererMixin.java @@ -21,6 +21,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import static org.lwjgl.opengl.GL11C.GL_TRIANGLE_STRIP; +import static org.lwjgl.opengl.GL11C.glDrawArrays; import static org.lwjgl.opengl.GL13C.GL_TEXTURE0; @Mixin(ScreenEffectRenderer.class) @@ -70,7 +72,7 @@ private static void renderTex(TextureAtlasSprite texture, PoseStack poseStack, C minecraft.getTextureManager().bindForSetup(texture.atlasLocation()); shader.bind(); - VeilRenderSystem.drawScreenQuad(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); ShaderProgram.unbind(); RenderSystem.activeTexture(activeTexture); @@ -111,7 +113,7 @@ private static void renderWater(Minecraft minecraft, PoseStack poseStack, Callba RenderSystem.enableBlend(); shader.bind(); - VeilRenderSystem.drawScreenQuad(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); ShaderProgram.unbind(); RenderSystem.disableBlend(); diff --git a/common/src/main/java/foundry/veil/mixin/performance/client/RenderTargetMixin.java b/common/src/main/java/foundry/veil/mixin/performance/client/RenderTargetMixin.java index 92d053696..a08a35656 100644 --- a/common/src/main/java/foundry/veil/mixin/performance/client/RenderTargetMixin.java +++ b/common/src/main/java/foundry/veil/mixin/performance/client/RenderTargetMixin.java @@ -1,7 +1,13 @@ package foundry.veil.mixin.performance.client; import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import foundry.veil.api.client.render.VeilRenderSystem; +import foundry.veil.api.client.render.shader.VeilShaders; +import foundry.veil.api.client.render.shader.program.ShaderProgram; +import foundry.veil.ext.PerformanceRenderTargetExtension; +import foundry.veil.ext.RenderTargetExtension; import org.lwjgl.system.MemoryStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -11,12 +17,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static org.lwjgl.opengl.ARBClearTexture.glClearTexImage; +import static org.lwjgl.opengl.ARBCopyImage.glCopyImageSubData; import static org.lwjgl.opengl.ARBDirectStateAccess.glBlitNamedFramebuffer; import static org.lwjgl.opengl.ARBDirectStateAccess.glClearNamedFramebufferfv; import static org.lwjgl.opengl.GL11C.*; @Mixin(RenderTarget.class) -public abstract class RenderTargetMixin { +public abstract class RenderTargetMixin implements PerformanceRenderTargetExtension { @Shadow public int frameBufferId; @@ -41,26 +48,37 @@ public abstract class RenderTargetMixin { @Shadow public abstract int getDepthTextureId(); + @Shadow + public abstract void bindWrite(boolean setViewport); + + @Shadow + public abstract void unbindWrite(); + @Inject(method = "copyDepthFrom", at = @At("HEAD"), cancellable = true) public void copyDepthFrom(RenderTarget otherTarget, CallbackInfo ci) { - if (!VeilRenderSystem.directStateAccessSupported()) { + if (!this.useDepth || !otherTarget.useDepth) { + ci.cancel(); return; } - ci.cancel(); - glBlitNamedFramebuffer(otherTarget.frameBufferId, this.frameBufferId, 0, 0, otherTarget.width, otherTarget.height, 0, 0, this.width, this.height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + if (VeilRenderSystem.copyImageSupported() && this.width == otherTarget.width && this.height == otherTarget.height) { + ci.cancel(); + glCopyImageSubData(otherTarget.getDepthTextureId(), GL_TEXTURE_2D, 0, 0, 0, 0, this.getDepthTextureId(), GL_TEXTURE_2D, 0, 0, 0, 0, this.width, this.height, 1); + } else if (VeilRenderSystem.directStateAccessSupported()) { + ci.cancel(); + glBlitNamedFramebuffer(otherTarget.frameBufferId, this.frameBufferId, 0, 0, otherTarget.width, otherTarget.height, 0, 0, this.width, this.height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + } } @Inject(method = "clear", at = @At("HEAD"), cancellable = true) public void clear(boolean clearError, CallbackInfo ci) { - if (!VeilRenderSystem.directStateAccessSupported()) { + boolean clearTex = VeilRenderSystem.clearTextureSupported(); + if (!clearTex && !VeilRenderSystem.directStateAccessSupported()) { return; } ci.cancel(); try (MemoryStack stack = MemoryStack.stackPush()) { - boolean clearTex = VeilRenderSystem.clearTextureSupported(); - if (clearTex) { glClearTexImage(this.getColorTextureId(), 0, GL_RGBA, GL_FLOAT, this.clearChannels); } else { @@ -80,4 +98,59 @@ public void clear(boolean clearError, CallbackInfo ci) { glGetError(); } } + + @Inject(method = "_blitToScreen", at = @At("HEAD"), cancellable = true) + private void _blitToScreen(int width, int height, boolean disableBlend, CallbackInfo ci) { + if (disableBlend && VeilRenderSystem.directStateAccessSupported()) { + ci.cancel(); + RenderSystem.assertOnRenderThread(); + GlStateManager._viewport(0, 0, width, height); + GlStateManager._colorMask(true, true, true, false); + int frameBufferId = ((RenderTargetExtension) this).veil$getFramebuffer(); + glBlitNamedFramebuffer(frameBufferId, 0, 0, 0, this.width, this.height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + GlStateManager._colorMask(true, true, true, true); + } else { + ShaderProgram shader = VeilRenderSystem.setShader(VeilShaders.BLIT_SCREEN); + if (shader == null) { + return; + } + + ci.cancel(); + RenderSystem.assertOnRenderThread(); + GlStateManager._viewport(0, 0, width, height); + GlStateManager._colorMask(true, true, true, false); + GlStateManager._depthMask(false); + GlStateManager._disableDepthTest(); + if (disableBlend) { + GlStateManager._disableBlend(); + } + + VeilRenderSystem.bindTextures(0, this.getColorTextureId()); + shader.bind(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + ShaderProgram.unbind(); + + GlStateManager._colorMask(true, true, true, true); + GlStateManager._depthMask(true); + } + } + + @Override + public void veil$clearColorBuffer(boolean clearError) { + RenderSystem.assertOnRenderThreadOrInit(); + if (VeilRenderSystem.clearTextureSupported()) { + glClearTexImage(this.getColorTextureId(), 0, GL_RGBA, GL_FLOAT, this.clearChannels); + } else if (VeilRenderSystem.directStateAccessSupported()) { + glClearNamedFramebufferfv(this.getColorTextureId(), GL_COLOR, 0, this.clearChannels); + } else { + this.bindWrite(true); + GlStateManager._clearColor(this.clearChannels[0], this.clearChannels[1], this.clearChannels[2], this.clearChannels[3]); + GlStateManager._clear(GL_COLOR_BUFFER_BIT, clearError); + this.unbindWrite(); + } + + if (clearError) { + glGetError(); + } + } } diff --git a/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineRenderTargetMixin.java b/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineRenderTargetMixin.java index 6dfd4d6a5..6bf667e91 100644 --- a/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineRenderTargetMixin.java +++ b/common/src/main/java/foundry/veil/mixin/pipeline/client/PipelineRenderTargetMixin.java @@ -22,9 +22,6 @@ public abstract class PipelineRenderTargetMixin implements RenderTargetExtension @Shadow public int viewHeight; - @Shadow - public abstract void bindWrite(boolean setViewport); - @Unique private AdvancedFbo veil$wrapper; diff --git a/common/src/main/resources/assets/veil/lang/en_us.json b/common/src/main/resources/assets/veil/lang/en_us.json index 907a54420..e50b91147 100644 --- a/common/src/main/resources/assets/veil/lang/en_us.json +++ b/common/src/main/resources/assets/veil/lang/en_us.json @@ -57,6 +57,7 @@ "inspector.veil.device_info.opengl.feature_flag.sparse_buffers": "Sparse Buffers? %s", "inspector.veil.device_info.opengl.feature_flag.direct_state_access": "Direct State Access? %s", "inspector.veil.device_info.opengl.feature_flag.clear_texture": "Clear Texture? %s", + "inspector.veil.device_info.opengl.feature_flag.copy_image": "Copy Image? %s", "inspector.veil.device_info.opengl.feature_flag.shader_storage_buffers": "Shader Storage Buffers? %s", "inspector.veil.device_info.opengl.feature_flag.program_interface_query": "Program Interface Query? %s", diff --git a/common/src/main/resources/assets/veil/pinwheel/shaders/include/space_helper.glsl b/common/src/main/resources/assets/veil/pinwheel/shaders/include/space_helper.glsl index cb1695f45..314fb5b5f 100644 --- a/common/src/main/resources/assets/veil/pinwheel/shaders/include/space_helper.glsl +++ b/common/src/main/resources/assets/veil/pinwheel/shaders/include/space_helper.glsl @@ -15,6 +15,10 @@ vec4 worldToViewSpace(vec4 pos) { return viewSpacePos / viewSpacePos.w; } +vec4 worldToLocalSpace(vec4 pos) { + return pos - vec4(VeilCamera.CameraPosition, 0.0); +} + vec4 worldToClipSpace(vec4 pos) { vec4 viewSpacePos = VeilCamera.ViewMat * (pos - vec4(VeilCamera.CameraPosition, 0.0)); return VeilCamera.ProjMat * (viewSpacePos / viewSpacePos.w); @@ -28,9 +32,11 @@ vec3 worldToScreenSpace(vec4 pos) { } #define worldToViewSpacePosition(pos) worldToViewSpace(vec4(pos, 1.0)).xyz +#define worldToLocalSpacePosition(pos) worldToLocalSpace(vec4(pos, 1.0)).xyz #define worldToClipSpacePosition(pos) worldToClipSpace(vec4(pos, 1.0)).xyz #define worldToScreenSpacePosition(pos) worldToScreenSpace(vec4(pos, 1.0)) #define worldToViewSpaceDirection(pos) worldToViewSpace(vec4(pos, 0.0)).xyz +#define worldToLocalSpaceDirection(pos) worldToLocalSpace(vec4(pos, 0.0)).xyz #define worldToClipSpaceDirection(pos) worldToClipSpace(vec4(pos, 0.0)).xyz #define worldToScreenSpaceDirection(pos) worldToScreenSpace(vec4(pos, 0.0)) @@ -40,6 +46,10 @@ vec4 viewToWorldSpace(vec4 pos) { return vec4(VeilCamera.CameraPosition, 0.0) + VeilCamera.IViewMat * pos; } +vec4 viewToLocalSpace(vec4 pos) { + return VeilCamera.IViewMat * pos; +} + vec4 viewToClipSpace(vec4 pos) { return VeilCamera.ProjMat * pos; } @@ -51,9 +61,11 @@ vec3 viewToScreenSpace(vec4 pos) { } #define viewToWorldSpacePosition(pos) viewToWorldSpace(vec4(pos, 1.0)).xyz +#define viewToLocalSpacePosition(pos) viewToLocalSpace(vec4(pos, 1.0)).xyz #define viewToClipSpacePosition(pos) viewToClipSpace(vec4(pos, 1.0)).xyz #define viewToScreenSpacePosition(pos) viewToScreenSpace(vec4(pos, 1.0)) #define viewToWorldSpaceDirection(pos) viewToWorldSpace(vec4(pos, 0.0)).xyz +#define viewToLocalSpaceDirection(pos) viewToLocalSpace(vec4(pos, 0.0)).xyz #define viewToClipSpaceDirection(pos) viewToClipSpace(vec4(pos, 0.0)).xyz #define viewToScreenSpaceDirection(pos) viewToScreenSpace(vec4(pos, 0.0)) @@ -63,6 +75,10 @@ vec4 clipToWorldSpace(vec4 pos) { return vec4(VeilCamera.CameraPosition, 0.0) + VeilCamera.IViewMat * VeilCamera.IProjMat * pos; } +vec4 clipToLocalSpace(vec4 pos) { + return VeilCamera.IViewMat * VeilCamera.IProjMat * pos; +} + vec4 clipToViewSpace(vec4 pos) { return VeilCamera.IProjMat * pos; } @@ -73,9 +89,11 @@ vec3 clipToScreenSpace(vec4 pos) { } #define clipToWorldSpacePosition(pos) clipToWorldSpace(vec4(pos, 1.0)).xyz +#define clipToLocalSpacePosition(pos) clipToLocalSpace(vec4(pos, 1.0)).xyz #define clipToViewSpacePosition(pos) clipToViewSpace(vec4(pos, 1.0)).xyz #define clipToScreenSpacePosition(pos) clipToScreenSpace(vec4(pos, 1.0)) #define clipToWorldSpaceDirection(pos) clipToWorldSpace(vec4(pos, 0.0)).xyz +#define clipToLocalSpaceDirection(pos) clipToLocalSpace(vec4(pos, 0.0)).xyz #define clipToViewSpaceDirection(pos) clipToViewSpace(vec4(pos, 0.0)).xyz #define clipToScreenSpaceDirection(pos) clipToScreenSpace(vec4(pos, 0.0)) @@ -86,6 +104,11 @@ vec4 screenToWorldSpace(vec3 pos) { return vec4(VeilCamera.CameraPosition, 0.0) + VeilCamera.IViewMat * (viewSpacePos / viewSpacePos.w); } +vec4 screenToLocalSpace(vec3 pos) { + vec4 viewSpacePos = VeilCamera.IProjMat * (vec4(pos.xy, pos.z, 1.0) * 2.0 - 1.0); + return VeilCamera.IViewMat * (viewSpacePos / viewSpacePos.w); +} + vec4 screenToViewSpace(vec3 pos) { vec4 viewSpacePos = VeilCamera.IProjMat * (vec4(pos.xy, pos.z, 1.0) * 2.0 - 1.0); return viewSpacePos / viewSpacePos.w; @@ -100,6 +123,11 @@ vec4 screenToWorldSpace(vec2 uv, float depth) { return vec4(VeilCamera.CameraPosition, 0.0) + VeilCamera.IViewMat * (viewSpacePos / viewSpacePos.w); } +vec4 screenToLocalSpace(vec2 uv, float depth) { + vec4 viewSpacePos = VeilCamera.IProjMat * (vec4(uv, depth, 1.0) * 2.0 - 1.0); + return VeilCamera.IViewMat * (viewSpacePos / viewSpacePos.w); +} + vec4 screenToViewSpace(vec2 uv, float depth) { vec4 viewSpacePos = VeilCamera.IProjMat * (vec4(uv, depth, 1.0) * 2.0 - 1.0); return viewSpacePos / viewSpacePos.w; diff --git a/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.fsh b/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.fsh index d7a130fe4..2b407ac52 100644 --- a/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.fsh +++ b/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.fsh @@ -1,11 +1,9 @@ uniform sampler2D DiffuseSampler; -uniform vec4 ColorModulator; - in vec2 texCoord; out vec4 fragColor; void main() { - fragColor = texture(DiffuseSampler, texCoord) * ColorModulator; + fragColor = texture(DiffuseSampler, texCoord); } diff --git a/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.vsh b/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.vsh index 7aae54c8f..5e030cdb3 100644 --- a/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.vsh +++ b/common/src/main/resources/assets/veil/pinwheel/shaders/program/blit_screen.vsh @@ -1,11 +1,7 @@ -layout(location = 0) in vec3 Position; - out vec2 texCoord; void main() { - gl_Position = vec4(Position, 1.0); - texCoord = Position.xy / 2.0 + 0.5; + vec2 uv = vec2(gl_VertexID & 1, gl_VertexID & 2); + gl_Position = vec4(uv * vec2(3.0) - vec2(1.0), 0.0, 1.0); + texCoord = uv * vec2(1.5); } - - - diff --git a/common/src/main/resources/resourcepacks/fog/assets/veil/pinwheel/shaders/program/space_test.fsh b/common/src/main/resources/resourcepacks/fog/assets/veil/pinwheel/shaders/program/space_test.fsh index a359e7c0e..d94c6c70e 100644 --- a/common/src/main/resources/resourcepacks/fog/assets/veil/pinwheel/shaders/program/space_test.fsh +++ b/common/src/main/resources/resourcepacks/fog/assets/veil/pinwheel/shaders/program/space_test.fsh @@ -10,7 +10,7 @@ out vec4 fragColor; void main() { vec4 baseColor = texture(DiffuseSampler0, texCoord); float depthSample = texture(DiffuseDepthSampler, texCoord).r; - vec4 pos = screenToWorldSpace(texCoord, depthSample); + vec4 pos = screenToLocalSpace(texCoord, depthSample); fragColor = vec4(pos.xyz, 1.0); } diff --git a/common/src/main/resources/veil.performance.mixins.json b/common/src/main/resources/veil.performance.mixins.json index 393f8183a..70b2294b1 100644 --- a/common/src/main/resources/veil.performance.mixins.json +++ b/common/src/main/resources/veil.performance.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_21", "refmap": "${mod_id}.refmap.json", "client": [ + "client.LevelRendererMixin", "client.PerformanceScreenEffectRendererMixin", "client.RenderTargetMixin" ],