diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index 217318e82..6f5c571a0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -252,11 +252,11 @@ public class LodRenderer bufferHandler.renderOpaque(this); if (Config.Client.Advanced.Graphics.Quality.ssao.get()) { -// SSAOShader.INSTANCE.render(partialTicks); +// SSAOShader.INSTANCE.render(partialTicks); // For some reason this looks slightly different :/ SSAORenderer.INSTANCE.render(partialTicks); } { -// FogShader.INSTANCE.render(partialTicks); + FogShader.INSTANCE.render(partialTicks); // DarkShader.INSTANCE.render(partialTicks); // A test shader to make the world darker } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java index ef5e6f3bd..bc709d164 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java @@ -24,6 +24,9 @@ public class FogShader extends AbstractShaderRenderer { // public final int modelOffsetUniform; // public final int worldYOffsetUniform; + public final int gProjUniform; + public final int gDepthMapUniform; + // Fog Uniforms public final int fogColorUniform; public final int fogScaleUniform; @@ -37,13 +40,16 @@ public class FogShader extends AbstractShaderRenderer { // This code is just a temp fix so that it looks fine for the time being // and even with the jank soloution, i cannot get it to work super(new ShaderProgram( - () -> Shader.loadFile("shaders/fog/fog.vert", false, new StringBuilder()).toString(), + () -> Shader.loadFile("shaders/normal.vert", false, new StringBuilder()).toString(), () -> fogConfig.loadAndProcessFragShader("shaders/fog/fog.frag", false).toString(), - "fragColor", new String[] { "vPos", "vPosition" } + "fragColor", new String[] { "vPosition" } )); // modelOffsetUniform = this.shader.getUniformLocation("modelOffset"); // worldYOffsetUniform = this.shader.tryGetUniformLocation("worldYOffset"); + + gProjUniform = this.shader.getUniformLocation("gProj"); + gDepthMapUniform = this.shader.getUniformLocation("gDepthMap"); // Fog uniforms fogColorUniform = this.shader.getUniformLocation("fogColor"); fullFogModeUniform = this.shader.getUniformLocation("fullFogMode"); @@ -56,8 +62,7 @@ public class FogShader extends AbstractShaderRenderer { @Override void setVertexAttributes() { - this.va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); - this.va.setVertexAttribute(0, 1, VertexAttribute.VertexPointer.addUnsignedShortsPointer(8, false, true)); // 2+2+2+2 + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); }; @Override @@ -68,8 +73,19 @@ public class FogShader extends AbstractShaderRenderer { vanillaDrawDistance += 32; // Give it a 2 chunk boundary for near fog. + Mat4f perspective = Mat4f.perspective( + (float) MC_RENDER.getFov(partialTicks), + MC_RENDER.getTargetFrameBufferViewportWidth() / (float) MC_RENDER.getTargetFrameBufferViewportHeight(), + RenderUtil.getNearClipPlaneDistanceInBlocks(partialTicks), + (float) ((lodDrawDistance + LodUtil.REGION_WIDTH) * Math.sqrt(2))); + + + // if (worldYOffsetUniform != -1) this.shader.setUniform(worldYOffsetUniform, (float) MC.getWrappedClientWorld().getMinHeight()); + + this.shader.setUniform(this.shader.getUniformLocation("gProj"), perspective); + GL32.glUniform1i(gDepthMapUniform, 0); // Fog this.shader.setUniform(fullFogModeUniform, MC_RENDER.isFogStateSpecial() ? 1 : 0); this.shader.setUniform(fogColorUniform, MC_RENDER.isFogStateSpecial() ? getSpecialFogColor(partialTicks) : getFogColor(partialTicks)); diff --git a/core/src/main/resources/shaders/fog/fog.frag b/core/src/main/resources/shaders/fog/fog.frag index e22281964..a487102dd 100644 --- a/core/src/main/resources/shaders/fog/fog.frag +++ b/core/src/main/resources/shaders/fog/fog.frag @@ -1,11 +1,14 @@ -in vec3 vertexWorldPos; +in vec2 TexCoord; + in float vertexYPos; //in uvec4 vPosition; //in vec2 TexCoord; out vec4 fragColor; +uniform sampler2D gDepthMap; +uniform mat4 gProj; uniform float fogScale; uniform float fogVerticalScale; @@ -43,6 +46,20 @@ float mod(float x, int y) { } +vec3 calcViewPosition(vec2 coords) { + float fragmentDepth = texture(gDepthMap, coords).r; + + vec4 ndc = vec4( + coords.x * 2.0 - 1.0, + coords.y * 2.0 - 1.0, + fragmentDepth * 2.0 - 1.0, + 1.0 + ); + + vec4 vs_pos = inverse(gProj) * ndc; + vs_pos.xyz = vs_pos.xyz / vs_pos.w; + return vs_pos.xyz; +} /** * Fragment shader for fog. @@ -51,6 +68,8 @@ float mod(float x, int y) { * version: 2023-6-21 */ void main() { + vec3 vertexWorldPos = calcViewPosition(TexCoord); + if (fullFogMode != 0) { fragColor = vec4(fogColor.r, fogColor.g, fogColor.b, 1.); } else { @@ -71,12 +90,12 @@ void main() { // Testing if (fragColor.r != 6969.) { // This line is so that the compiler doesnt delete the previos code - fragColor = vec4( - mod(vertexWorldPos.x, 1), - mod(vertexWorldPos.y, 1), - mod(vertexWorldPos.z, 1), - 1. - ); +// fragColor = vec4( +// mod(vertexWorldPos.x, 1), +// mod(vertexWorldPos.y, 1), +// mod(vertexWorldPos.z, 1), +// 1. +// ); // fragColor = vec4( // mod(vPosition.x, 1), // mod(vPosition.y, 1), diff --git a/core/src/main/resources/shaders/fog/fog.vert b/core/src/main/resources/shaders/fog/fog.vert deleted file mode 100644 index 0663c7a11..000000000 --- a/core/src/main/resources/shaders/fog/fog.vert +++ /dev/null @@ -1,22 +0,0 @@ -#version 150 core - - -//uniform vec3 modelOffset; -//uniform float worldYOffset; - -//in uvec4 vPosition; -in vec2 vPos; -out vec3 vertexWorldPos; -out float vertexYPos; - - -void main() -{ -// vertexWorldPos = vPosition.xyz + modelOffset; -// vertexWorldPos = vPosition.xyz; - vertexWorldPos = vec3(0.); - vertexYPos = 0.; -// vertexYPos = vPosition.y + worldYOffset; - - gl_Position = vec4(vPos, 1.0, 1.0); -} \ No newline at end of file