From 8401353e4dcc19509781c47ea4e1e35f34902ba1 Mon Sep 17 00:00:00 2001 From: coolGi Date: Fri, 21 Jul 2023 19:13:08 +0930 Subject: [PATCH 1/8] Another save commit for fog fix --- .../shaders/AbstractShaderRenderer.java | 11 +++++---- .../render/renderer/shaders/FogShader.java | 14 +++++++---- .../render/renderer/shaders/SSAOShader.java | 10 ++++++-- core/src/main/resources/shaders/fog/fog.frag | 23 ++++++++++--------- core/src/main/resources/shaders/fog/fog.vert | 9 +++++--- core/src/main/resources/shaders/normal.vert | 6 ++--- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java index 43b6a1704..53932bdab 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java @@ -29,7 +29,7 @@ public abstract class AbstractShaderRenderer { protected final ShaderProgram shader; protected final ShaderProgram applyShader; - protected GLVertexBuffer boxBuffer; + public GLVertexBuffer boxBuffer; protected VertexAttribute va; boolean init = false; @@ -46,9 +46,8 @@ public abstract class AbstractShaderRenderer { protected AbstractShaderRenderer(ShaderProgram shader, ShaderProgram applyShader) { this.shader = shader; this.applyShader = applyShader; - - } + private void init() { if (init) return; init = true; @@ -56,7 +55,7 @@ public abstract class AbstractShaderRenderer { va = VertexAttribute.create(); va.bind(); // Pos - va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + setVertexAttributes(); va.completeAndCheck(Float.BYTES * 2); // Some shader stuff needs to be set a bit later than @@ -65,6 +64,10 @@ public abstract class AbstractShaderRenderer { createBuffer(); } + /** Sets all the vertex attributes */ + void setVertexAttributes() { + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + }; /** Overwrite this to apply uniforms to the shader */ void setShaderUniforms(float partialTicks) {}; /** Overwrite this to apply uniforms to the apply shader */ 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 87a5805f8..ef5e6f3bd 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 @@ -6,6 +6,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.render.fog.LodFogConfig; import com.seibel.distanthorizons.core.render.glObject.shader.Shader; import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexAttribute; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; @@ -21,7 +22,7 @@ public class FogShader extends AbstractShaderRenderer { // public final int modelOffsetUniform; - public final int worldYOffsetUniform; +// public final int worldYOffsetUniform; // Fog Uniforms public final int fogColorUniform; @@ -38,11 +39,11 @@ public class FogShader extends AbstractShaderRenderer { super(new ShaderProgram( () -> Shader.loadFile("shaders/fog/fog.vert", false, new StringBuilder()).toString(), () -> fogConfig.loadAndProcessFragShader("shaders/fog/fog.frag", false).toString(), - "fragColor", new String[] { "vPosition", "vPos", "color" } + "fragColor", new String[] { "vPos", "vPosition" } )); // modelOffsetUniform = this.shader.getUniformLocation("modelOffset"); - worldYOffsetUniform = this.shader.getUniformLocation("worldYOffset"); +// worldYOffsetUniform = this.shader.tryGetUniformLocation("worldYOffset"); // Fog uniforms fogColorUniform = this.shader.getUniformLocation("fogColor"); fullFogModeUniform = this.shader.getUniformLocation("fullFogMode"); @@ -53,6 +54,11 @@ public class FogShader extends AbstractShaderRenderer { nearFogLengthUniform = this.shader.tryGetUniformLocation("nearFogLength"); } + @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 + }; @Override void setShaderUniforms(float partialTicks) { @@ -62,7 +68,7 @@ public class FogShader extends AbstractShaderRenderer { vanillaDrawDistance += 32; // Give it a 2 chunk boundary for near fog. - this.shader.setUniform(worldYOffsetUniform, (float) MC.getWrappedClientWorld().getMinHeight()); +// if (worldYOffsetUniform != -1) this.shader.setUniform(worldYOffsetUniform, (float) MC.getWrappedClientWorld().getMinHeight()); // Fog this.shader.setUniform(fullFogModeUniform, MC_RENDER.isFogStateSpecial() ? 1 : 0); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java index db7a18cf6..d7fb1e8d8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java @@ -1,6 +1,7 @@ package com.seibel.distanthorizons.core.render.renderer.shaders; import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexAttribute; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.coreapi.util.math.Mat4f; @@ -16,9 +17,9 @@ public class SSAOShader extends AbstractShaderRenderer { public SSAOShader() { super( new ShaderProgram("shaders/normal.vert", "shaders/ssao/ao.frag", - "fragColor", new String[]{"vPos"}), + "fragColor", new String[]{"vPosition"}), new ShaderProgram("shaders/normal.vert", "shaders/ssao/apply-frag.frag", - "fragColor", new String[]{"vPos"}) + "fragColor", new String[]{"vPosition"}) ); } @@ -28,6 +29,11 @@ public class SSAOShader extends AbstractShaderRenderer { kernel = genKernel(); } + @Override + void setVertexAttributes() { + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + } + @Override void setShaderUniforms(float partialTicks) { Mat4f perspective = Mat4f.perspective( diff --git a/core/src/main/resources/shaders/fog/fog.frag b/core/src/main/resources/shaders/fog/fog.frag index d4a5a4653..e22281964 100644 --- a/core/src/main/resources/shaders/fog/fog.frag +++ b/core/src/main/resources/shaders/fog/fog.frag @@ -1,6 +1,7 @@ in vec3 vertexWorldPos; in float vertexYPos; +//in uvec4 vPosition; //in vec2 TexCoord; out vec4 fragColor; @@ -69,20 +70,20 @@ 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. -//// ); + 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(vertexYPos, 1), -// mod(vertexYPos, 1), -// mod(vertexYPos, 1), +// mod(vPosition.x, 1), +// mod(vPosition.y, 1), +// mod(vPosition.z, 1), // 1. // ); -// } + } } diff --git a/core/src/main/resources/shaders/fog/fog.vert b/core/src/main/resources/shaders/fog/fog.vert index 463249402..0663c7a11 100644 --- a/core/src/main/resources/shaders/fog/fog.vert +++ b/core/src/main/resources/shaders/fog/fog.vert @@ -2,10 +2,10 @@ //uniform vec3 modelOffset; -uniform float worldYOffset; +//uniform float worldYOffset; +//in uvec4 vPosition; in vec2 vPos; -in uvec4 vPosition; out vec3 vertexWorldPos; out float vertexYPos; @@ -13,7 +13,10 @@ out float vertexYPos; void main() { // vertexWorldPos = vPosition.xyz + modelOffset; - vertexYPos = vPosition.y + worldYOffset; +// 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 diff --git a/core/src/main/resources/shaders/normal.vert b/core/src/main/resources/shaders/normal.vert index 1485baf0e..fe4bfe03b 100644 --- a/core/src/main/resources/shaders/normal.vert +++ b/core/src/main/resources/shaders/normal.vert @@ -1,11 +1,11 @@ #version 150 core -in vec2 vPos; +in vec2 vPosition; out vec2 TexCoord; void main() { - gl_Position = vec4(vPos, 1.0, 1.0); - TexCoord = vPos.xy * 0.5 + 0.5; + gl_Position = vec4(vPosition, 1.0, 1.0); + TexCoord = vPosition.xy * 0.5 + 0.5; } \ No newline at end of file From c8e6a56467017a1c1e64092a9e2afb753b3d6026 Mon Sep 17 00:00:00 2001 From: coolGi Date: Fri, 21 Jul 2023 19:51:15 +0930 Subject: [PATCH 2/8] Changed noiseDropoff to an int, and changed the order of noise and fog --- .../client/IDhApiNoiseTextureConfig.java | 8 +- .../client/DhApiNoiseTextureConfig.java | 4 +- .../distanthorizons/core/config/Config.java | 11 +- .../core/render/fog/LodFogConfig.java | 4 +- .../main/resources/shaders/flat_shaded.frag | 130 ++++++++++-------- 5 files changed, 84 insertions(+), 73 deletions(-) diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java index fc0598b1d..bf490429d 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java @@ -40,11 +40,9 @@ public interface IDhApiNoiseTextureConfig extends IDhApiConfigGroup IDhApiConfigValue noiseIntensity(); /** - * Defines how far should the noise texture render before it fades away.

- * - * 0.0 - the noise texture will render the entire LOD render distance.
- * 3.0 - the noise texture will fade away at 1/3 of the LOD render distance. + * Defines how far should the noise texture render before it fades away. (in blocks)
+ * Set to 0 to disable noise from fading away */ - IDhApiConfigValue noiseDropoff(); + IDhApiConfigValue noiseDropoff(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java index eff0162a2..a29637de8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java @@ -45,7 +45,7 @@ public class DhApiNoiseTextureConfig implements IDhApiNoiseTextureConfig { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseIntensity); } @Override - public IDhApiConfigValue noiseDropoff() - { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff); } + public IDhApiConfigValue noiseDropoff() + { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 33f325060..9376024cc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -468,14 +468,11 @@ public class Config + "How intense should the noise should be?") .build(); - public static ConfigEntry noiseDropoff = new ConfigEntry.Builder() // TODO: Make this a float (the ClassicConfigGUI doesn't support floats) - .setMinDefaultMax(0d, 3d, null) + public static ConfigEntry noiseDropoff = new ConfigEntry.Builder() // TODO: Make this a float (the ClassicConfigGUI doesn't support floats) + .setMinDefaultMax(0, 1024, null) .comment("" - + "How far should the noise texture render before it fades away? \n" - + "\n" - + "0.0 - the noise texture will render the entire LOD render distance. \n" - + "3.0 - the noise texture will fade away at 1/3 of the LOD render distance. \n" - + "") + + "Defines how far should the noise texture render before it fades away. (in blocks) \n" + + "Set to 0 to disable noise from fading away") .build(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java index 4d44bc0ba..1b606638d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java @@ -60,7 +60,7 @@ public class LodFogConfig public final boolean noiseEnable; public final int noiseSteps; public final float noiseIntensity; - public final float noiseDropoff; + public final int noiseDropoff; public static LodFogConfig generateFogConfig() @@ -82,7 +82,7 @@ public class LodFogConfig noiseEnable = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseEnabled.get(); noiseSteps = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseSteps.get(); noiseIntensity = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseIntensity.get().floatValue(); - noiseDropoff = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff.get().floatValue(); + noiseDropoff = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff.get(); if (fogDrawMode != EFogDrawMode.FOG_DISABLED) diff --git a/core/src/main/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index 3d7632a2b..e16dc3936 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -6,16 +6,21 @@ in vec4 vPos; out vec4 fragColor; +// Fog uniforms uniform float fogScale; uniform float fogVerticalScale; uniform float nearFogStart; uniform float nearFogLength; uniform int fullFogMode; +// Noise uniforms uniform bool noiseEnabled; uniform int noiseSteps; uniform float noiseIntensity; -uniform float noiseDropoff; +uniform int noiseDropoff; + +// SSAO uniforms +//uniform bool ssaoEnabled; /* ========MARCO DEFINED BY RUNTIME CODE GEN========= @@ -84,20 +89,82 @@ vec3 HSV2RGB(vec3 c) { } -/** +/** * Fragment Shader - * + * * author: James Seibel * author: coolGi * version: 7-2-2023 */ void main() { - vec4 returnColor; + fragColor = vertexColor; + + // TODO: Move into its own function instead of in an if statement + if (noiseEnabled) { + // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable + vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); + vec3 fixedVPos = vec3( + vPos.x - vertexNormal.x * 0.001, + vPos.y - vertexNormal.y * 0.001, + vPos.z - vertexNormal.z * 0.001 + ); + float noiseAmplification = noiseIntensity / 100; + noiseAmplification = (-1 * pow(2*((fragColor.x + fragColor.y + fragColor.z) / 3) - 1, 2) + 1) * noiseAmplification; // Lessen the effect on depending on how dark the object is, equasion for this is -(2x-1)^{2}+1 + noiseAmplification *= fragColor.w; // The effect would lessen on transparent objects + + // Random value for each position + float randomValue = rand(vec3( + quantize(fixedVPos.x, noiseSteps), + quantize(fixedVPos.y, noiseSteps), + quantize(fixedVPos.z, noiseSteps) + )) + * 2. * noiseAmplification - noiseAmplification; + + + // Modifies the color + // A value of 0 on the randomValue will result in the original color, while a value of 1 will result in a fully bright color + vec3 newCol = fragColor.rgb + (vec3(1.0) - fragColor.rgb) * randomValue; + + // Clamps it and turns it back into a vec4 + if (noiseDropoff == 0) + fragColor = vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ); + else + fragColor = mix( + vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ), fragColor, + clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied + ); + + // For testing + // if (fragColor.r != 69420.) { + // fragColor = vec4( + // mod(fixedVPos.x, 1), + // mod(fixedVPos.y, 1), + // mod(fixedVPos.z, 1), + // fragColor.w); + // } + } + +// // TODO: Move into its own function instead of in an if statement +// if (ssaoEnabled) { +// +// } + + // TODO: Move into its own function instead of in an if statement if (fullFogMode != 0) { - returnColor = vec4(fogColor.rgb, 1.0); + fragColor = vec4(fogColor.rgb, 1.0); } else { // TODO: add a white texture to support Optifine shaders //vec4 textureColor = texture(texImage, textureCoord); @@ -115,59 +182,8 @@ void main() float mixedFogThickness = clamp(mixFogThickness( nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); - returnColor = mix(vertexColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); + fragColor = mix(fragColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); } - - if (noiseEnabled) { - // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable - vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); - vec3 fixedVPos = vec3( - vPos.x - vertexNormal.x * 0.001, - vPos.y - vertexNormal.y * 0.001, - vPos.z - vertexNormal.z * 0.001 - ); - - - float noiseAmplification = noiseIntensity / 100; - noiseAmplification = (-1 * pow(2*((returnColor.x + returnColor.y + returnColor.z) / 3) - 1, 2) + 1) * noiseAmplification; // Lessen the effect on depending on how dark the object is, equasion for this is -(2x-1)^{2}+1 - noiseAmplification *= returnColor.w; // The effect would lessen on transparent objects - - // Random value for each position - float randomValue = rand(vec3( - quantize(fixedVPos.x, noiseSteps), - quantize(fixedVPos.y, noiseSteps), - quantize(fixedVPos.z, noiseSteps) - )) - * 2. * noiseAmplification - noiseAmplification; - - - // Modifies the color - // A value of 0 on the randomValue will result in the original color, while a value of 1 will result in a fully bright color - vec3 newCol = returnColor.rgb + (vec3(1.0) - returnColor.rgb) * randomValue; - - // Clamps it and turns it back into a vec4 - returnColor = mix( - vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - returnColor.w - ), returnColor, - clamp(length(vertexWorldPos) * fogScale * noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied - ); - - // For testing -// if (returnColor.r != 69420.) { -// returnColor = vec4( -// mod(fixedVPos.x, 1), -// mod(fixedVPos.y, 1), -// mod(fixedVPos.z, 1), -// returnColor.w); -// } - } - - // If "w" is just set to just 1. then it would crash - fragColor = returnColor; } From a724938f7187d998a2992553420d22725c764ed4 Mon Sep 17 00:00:00 2001 From: coolGi Date: Wed, 2 Aug 2023 23:04:34 +0930 Subject: [PATCH 3/8] Shader save commit --- .../core/render/fog/LodFogConfig.java | 1 + .../core/render/renderer/LodRenderProgram.java | 6 ++++-- core/src/main/resources/shaders/flat_shaded.frag | 16 +++++----------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java index 1b606638d..8387d7979 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java @@ -57,6 +57,7 @@ public class LodFogConfig // TODO: Move these out of here public final int earthCurveRatio; + // Noise Values public final boolean noiseEnable; public final int noiseSteps; public final float noiseIntensity; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index ad7e096f4..af7594cbc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -85,7 +85,7 @@ public class LodRenderProgram extends ShaderProgram lightMapUniform = getUniformLocation("lightMap"); - // Fog uniforms + // Fog Uniforms fullFogModeUniform = getUniformLocation("fullFogMode"); fogColorUniform = getUniformLocation("fogColor"); fogScaleUniform = tryGetUniformLocation("fogScale"); @@ -94,12 +94,13 @@ public class LodRenderProgram extends ShaderProgram nearFogStartUniform = tryGetUniformLocation("nearFogStart"); nearFogLengthUniform = tryGetUniformLocation("nearFogLength"); - // Noise uniforms + // Noise Uniforms noiseEnabledUniform = getUniformLocation("noiseEnabled"); noiseStepsUniform = getUniformLocation("noiseSteps"); noiseIntensityUniform = getUniformLocation("noiseIntensity"); noiseDropoffUniform = getUniformLocation("noiseDropoff"); + // TODO: Add better use of the LODFormat thing int vertexByteCount = LodUtil.LOD_VERTEX_FORMAT.getByteSize(); if (GLProxy.getInstance().VertexAttributeBufferBindingSupported) @@ -122,6 +123,7 @@ public class LodRenderProgram extends ShaderProgram if (earthRadiusUniform != -1) setUniform(earthRadiusUniform, /*6371KM*/ 6371000.0f / fogConfig.earthCurveRatio); + // Noise Uniforms setUniform(noiseEnabledUniform, fogConfig.noiseEnable); setUniform(noiseStepsUniform, fogConfig.noiseSteps); setUniform(noiseIntensityUniform, fogConfig.noiseIntensity); diff --git a/core/src/main/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index e16dc3936..014abece5 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -6,22 +6,19 @@ in vec4 vPos; out vec4 fragColor; -// Fog uniforms +// Fog Uniforms uniform float fogScale; uniform float fogVerticalScale; uniform float nearFogStart; uniform float nearFogLength; uniform int fullFogMode; -// Noise uniforms +// Noise Uniforms uniform bool noiseEnabled; uniform int noiseSteps; uniform float noiseIntensity; uniform int noiseDropoff; -// SSAO uniforms -//uniform bool ssaoEnabled; - /* ========MARCO DEFINED BY RUNTIME CODE GEN========= float farFogStart; @@ -89,6 +86,7 @@ vec3 HSV2RGB(vec3 c) { } + /** * Fragment Shader * @@ -100,10 +98,11 @@ void main() { fragColor = vertexColor; + // TODO: Move into its own function instead of in an if statement if (noiseEnabled) { - // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); + // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable vec3 fixedVPos = vec3( vPos.x - vertexNormal.x * 0.001, vPos.y - vertexNormal.y * 0.001, @@ -157,11 +156,6 @@ void main() // } } -// // TODO: Move into its own function instead of in an if statement -// if (ssaoEnabled) { -// -// } - // TODO: Move into its own function instead of in an if statement if (fullFogMode != 0) { fragColor = vec4(fogColor.rgb, 1.0); From 3ea55065b3522f86d57b8c7e4526e353263f9b04 Mon Sep 17 00:00:00 2001 From: coolGi Date: Wed, 2 Aug 2023 23:23:06 +0930 Subject: [PATCH 4/8] Fog shader should be working --- .../core/render/renderer/LodRenderer.java | 4 +-- .../render/renderer/shaders/FogShader.java | 24 +++++++++++--- core/src/main/resources/shaders/fog/fog.frag | 33 +++++++++++++++---- core/src/main/resources/shaders/fog/fog.vert | 22 ------------- 4 files changed, 48 insertions(+), 35 deletions(-) delete mode 100644 core/src/main/resources/shaders/fog/fog.vert 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 From 76bc81233a9b973326e7209b6d24d7816ecbe296 Mon Sep 17 00:00:00 2001 From: coolGi Date: Wed, 2 Aug 2023 23:29:30 +0930 Subject: [PATCH 5/8] Removed old fog --- .../render/renderer/LodRenderProgram.java | 36 ++------- .../main/resources/shaders/flat_shaded.frag | 77 +------------------ core/src/main/resources/shaders/fog/fog.frag | 14 ++++ 3 files changed, 20 insertions(+), 107 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index af7594cbc..83bbf669a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -53,13 +53,6 @@ public class LodRenderProgram extends ShaderProgram public final int earthRadiusUniform; public final int lightMapUniform; - // Fog Uniforms - public final int fogColorUniform; - public final int fogScaleUniform; - public final int fogVerticalScaleUniform; - public final int nearFogStartUniform; - public final int nearFogLengthUniform;; - public final int fullFogModeUniform; // Noise Uniforms public final int noiseEnabledUniform; @@ -71,10 +64,11 @@ public class LodRenderProgram extends ShaderProgram // This will bind VertexAttribute public LodRenderProgram(LodFogConfig fogConfig) { - super(() -> Shader.loadFile(fogConfig.earthCurveRatio!=0 ? VERTEX_CURVE_SHADER_PATH : VERTEX_SHADER_PATH, - false, new StringBuilder()).toString(), - () -> fogConfig.loadAndProcessFragShader(FRAGMENT_SHADER_PATH, false).toString(), - "fragColor", new String[] { "vPosition", "color" }); + super( + fogConfig.earthCurveRatio!=0 ? VERTEX_CURVE_SHADER_PATH : VERTEX_SHADER_PATH, + FRAGMENT_SHADER_PATH, + "fragColor", new String[] { "vPosition", "color" } + ); this.fogConfig = fogConfig; combinedMatUniform = getUniformLocation("combinedMatrix"); @@ -85,15 +79,6 @@ public class LodRenderProgram extends ShaderProgram lightMapUniform = getUniformLocation("lightMap"); - // Fog Uniforms - fullFogModeUniform = getUniformLocation("fullFogMode"); - fogColorUniform = getUniformLocation("fogColor"); - fogScaleUniform = tryGetUniformLocation("fogScale"); - fogVerticalScaleUniform = tryGetUniformLocation("fogVerticalScale"); - // near - nearFogStartUniform = tryGetUniformLocation("nearFogStart"); - nearFogLengthUniform = tryGetUniformLocation("nearFogLength"); - // Noise Uniforms noiseEnabledUniform = getUniformLocation("noiseEnabled"); noiseStepsUniform = getUniformLocation("noiseSteps"); @@ -175,17 +160,6 @@ public class LodRenderProgram extends ShaderProgram setUniform(lightMapUniform, lightmapBindPoint); if (worldYOffsetUniform != -1) setUniform(worldYOffsetUniform, (float)worldYOffset); - - // Fog - setUniform(fullFogModeUniform, fullFogMode ? 1 : 0); - setUniform(fogColorUniform, fogColor); - - float nearFogLen = vanillaDrawDistance * 0.2f / lodDrawDistance; - float nearFogStart = vanillaDrawDistance * (VERSION_CONSTANTS.isVanillaRenderedChunkSquare() ? (float)Math.sqrt(2.) : 1.f) / lodDrawDistance; - if (nearFogStartUniform != -1) setUniform(nearFogStartUniform, nearFogStart); - if (nearFogLengthUniform != -1) setUniform(nearFogLengthUniform, nearFogLen); - if (fogScaleUniform != -1) setUniform(fogScaleUniform, 1.f/lodDrawDistance); - if (fogVerticalScaleUniform != -1) setUniform(fogVerticalScaleUniform, 1.f/worldHeight); } public void setModelPos(Vec3f modelPos) { diff --git a/core/src/main/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index 014abece5..a8a092321 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -1,3 +1,4 @@ +#version 150 core in vec4 vertexColor; in vec3 vertexWorldPos; @@ -6,45 +7,12 @@ in vec4 vPos; out vec4 fragColor; -// Fog Uniforms -uniform float fogScale; -uniform float fogVerticalScale; -uniform float nearFogStart; -uniform float nearFogLength; -uniform int fullFogMode; - // Noise Uniforms uniform bool noiseEnabled; uniform int noiseSteps; uniform float noiseIntensity; uniform int noiseDropoff; -/* ========MARCO DEFINED BY RUNTIME CODE GEN========= - -float farFogStart; -float farFogLength; -float farFogMin; -float farFogRange; -float farFogDensity; - -float heightFogStart; -float heightFogLength; -float heightFogMin; -float heightFogRange; -float heightFogDensity; -*/ - -uniform vec4 fogColor; - -// method definitions -// ==== The below 5 methods will be run-time generated. ==== -float getNearFogThickness(float dist); -float getFarFogThickness(float dist); -float getHeightFogThickness(float dist); -float calculateFarFogDepth(float horizontal, float dist, float nearFogStart); -float calculateHeightFogDepth(float vertical, float realY); -float mixFogThickness(float near, float far, float height); -// ========================================================= float fade(float value, float start, float end) { return (clamp(value,start,end)-start)/(end-start); @@ -155,47 +123,4 @@ void main() // fragColor.w); // } } - - // TODO: Move into its own function instead of in an if statement - if (fullFogMode != 0) { - fragColor = vec4(fogColor.rgb, 1.0); - } else { - // TODO: add a white texture to support Optifine shaders - //vec4 textureColor = texture(texImage, textureCoord); - //fragColor = vertexColor * textureColor; - - float horizontalDist = length(vertexWorldPos.xz) * fogScale; - float heightDist = calculateHeightFogDepth( - vertexWorldPos.y, vertexYPos) * fogVerticalScale; - float farDist = calculateFarFogDepth(horizontalDist, - length(vertexWorldPos.xyz) * fogScale, nearFogStart); - - float nearFogThickness = getNearFogThickness(horizontalDist); - float farFogThickness = getFarFogThickness(farDist); - float heightFogThickness = getHeightFogThickness(heightDist); - float mixedFogThickness = clamp(mixFogThickness( - nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); - - fragColor = mix(fragColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); - } -} - - - -// Are these still needed? -float linearFog(float x, float fogStart, float fogLength, float fogMin, float fogRange) { - x = clamp((x-fogStart)/fogLength, 0.0, 1.0); - return fogMin + fogRange * x; -} - -float exponentialFog(float x, float fogStart, float fogLength, - float fogMin, float fogRange, float fogDensity) { - x = max((x-fogStart)/fogLength, 0.0) * fogDensity; - return fogMin + fogRange - fogRange/exp(x); -} - -float exponentialSquaredFog(float x, float fogStart, float fogLength, - float fogMin, float fogRange, float fogDensity) { - x = max((x-fogStart)/fogLength, 0.0) * fogDensity; - return fogMin + fogRange - fogRange/exp(x*x); } \ No newline at end of file diff --git a/core/src/main/resources/shaders/fog/fog.frag b/core/src/main/resources/shaders/fog/fog.frag index a487102dd..ab81122ee 100644 --- a/core/src/main/resources/shaders/fog/fog.frag +++ b/core/src/main/resources/shaders/fog/fog.frag @@ -19,6 +19,20 @@ uniform int fullFogMode; uniform vec4 fogColor; +/* ========MARCO DEFINED BY RUNTIME CODE GEN========= + +float farFogStart; +float farFogLength; +float farFogMin; +float farFogRange; +float farFogDensity; + +float heightFogStart; +float heightFogLength; +float heightFogMin; +float heightFogRange; +float heightFogDensity; +*/ // method definitions // ==== The below 5 methods will be run-time generated. ==== From 146c2e6f1ca560159a6d9a92c2c1c068cb3f7940 Mon Sep 17 00:00:00 2001 From: coolGi Date: Sat, 5 Aug 2023 14:58:03 +0930 Subject: [PATCH 6/8] Final save commit for another attempt to fix fog, before revert. --- core/src/main/resources/shaders/fog/fog.frag | 21 +++++++------------- core/src/main/resources/shaders/ssao/ao.frag | 1 - 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/core/src/main/resources/shaders/fog/fog.frag b/core/src/main/resources/shaders/fog/fog.frag index ab81122ee..d19f59906 100644 --- a/core/src/main/resources/shaders/fog/fog.frag +++ b/core/src/main/resources/shaders/fog/fog.frag @@ -1,9 +1,7 @@ in vec2 TexCoord; -in float vertexYPos; -//in uvec4 vPosition; -//in vec2 TexCoord; +//in float vertexYPos; out vec4 fragColor; @@ -82,6 +80,7 @@ vec3 calcViewPosition(vec2 coords) { * version: 2023-6-21 */ void main() { + float vertexYPos = 100f; vec3 vertexWorldPos = calcViewPosition(TexCoord); if (fullFogMode != 0) { @@ -103,20 +102,14 @@ void main() { } // Testing - if (fragColor.r != 6969.) { // This line is so that the compiler doesnt delete the previos code +// 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), +// mod(texture(gDepthMap, TexCoord).x, 1), +// mod(texture(gDepthMap, TexCoord).y, 1), +// mod(texture(gDepthMap, TexCoord).z, 1), // 1. // ); -// fragColor = vec4( -// mod(vPosition.x, 1), -// mod(vPosition.y, 1), -// mod(vPosition.z, 1), -// 1. -// ); - } +// } } diff --git a/core/src/main/resources/shaders/ssao/ao.frag b/core/src/main/resources/shaders/ssao/ao.frag index d8d77ccf0..15f648764 100644 --- a/core/src/main/resources/shaders/ssao/ao.frag +++ b/core/src/main/resources/shaders/ssao/ao.frag @@ -1,7 +1,6 @@ #version 150 core in vec2 TexCoord; -in vec2 ViewRay; out vec4 fragColor; From 5800029206a2727414b7c4f6a93633178548ce0d Mon Sep 17 00:00:00 2001 From: coolGi Date: Sat, 5 Aug 2023 15:03:26 +0930 Subject: [PATCH 7/8] Reverted previous removing fog from main shader --- .../render/renderer/LodRenderProgram.java | 37 +++++- .../core/render/renderer/LodRenderer.java | 2 +- .../main/resources/shaders/flat_shaded.frag | 122 ++++++++++++++---- 3 files changed, 132 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index 83bbf669a..cecf49059 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -54,6 +54,14 @@ public class LodRenderProgram extends ShaderProgram public final int lightMapUniform; + // Fog Uniforms + public final int fogColorUniform; + public final int fogScaleUniform; + public final int fogVerticalScaleUniform; + public final int nearFogStartUniform; + public final int nearFogLengthUniform;; + public final int fullFogModeUniform; + // Noise Uniforms public final int noiseEnabledUniform; public final int noiseStepsUniform; @@ -64,11 +72,10 @@ public class LodRenderProgram extends ShaderProgram // This will bind VertexAttribute public LodRenderProgram(LodFogConfig fogConfig) { - super( - fogConfig.earthCurveRatio!=0 ? VERTEX_CURVE_SHADER_PATH : VERTEX_SHADER_PATH, - FRAGMENT_SHADER_PATH, - "fragColor", new String[] { "vPosition", "color" } - ); + super(() -> Shader.loadFile(fogConfig.earthCurveRatio!=0 ? VERTEX_CURVE_SHADER_PATH : VERTEX_SHADER_PATH, + false, new StringBuilder()).toString(), + () -> fogConfig.loadAndProcessFragShader(FRAGMENT_SHADER_PATH, false).toString(), + "fragColor", new String[] { "vPosition", "color" }); this.fogConfig = fogConfig; combinedMatUniform = getUniformLocation("combinedMatrix"); @@ -79,6 +86,15 @@ public class LodRenderProgram extends ShaderProgram lightMapUniform = getUniformLocation("lightMap"); + // Fog Uniforms + fullFogModeUniform = getUniformLocation("fullFogMode"); + fogColorUniform = getUniformLocation("fogColor"); + fogScaleUniform = tryGetUniformLocation("fogScale"); + fogVerticalScaleUniform = tryGetUniformLocation("fogVerticalScale"); + // near + nearFogStartUniform = tryGetUniformLocation("nearFogStart"); + nearFogLengthUniform = tryGetUniformLocation("nearFogLength"); + // Noise Uniforms noiseEnabledUniform = getUniformLocation("noiseEnabled"); noiseStepsUniform = getUniformLocation("noiseSteps"); @@ -160,6 +176,17 @@ public class LodRenderProgram extends ShaderProgram setUniform(lightMapUniform, lightmapBindPoint); if (worldYOffsetUniform != -1) setUniform(worldYOffsetUniform, (float)worldYOffset); + + // Fog + setUniform(fullFogModeUniform, fullFogMode ? 1 : 0); + setUniform(fogColorUniform, fogColor); + + float nearFogLen = vanillaDrawDistance * 0.2f / lodDrawDistance; + float nearFogStart = vanillaDrawDistance * (VERSION_CONSTANTS.isVanillaRenderedChunkSquare() ? (float)Math.sqrt(2.) : 1.f) / lodDrawDistance; + if (nearFogStartUniform != -1) setUniform(nearFogStartUniform, nearFogStart); + if (nearFogLengthUniform != -1) setUniform(nearFogLengthUniform, nearFogLen); + if (fogScaleUniform != -1) setUniform(fogScaleUniform, 1.f/lodDrawDistance); + if (fogVerticalScaleUniform != -1) setUniform(fogVerticalScaleUniform, 1.f/worldHeight); } public void setModelPos(Vec3f modelPos) { 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 6f5c571a0..f622276af 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 @@ -256,7 +256,7 @@ public class LodRenderer 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/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index a8a092321..0252c0b4c 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -1,4 +1,3 @@ -#version 150 core in vec4 vertexColor; in vec3 vertexWorldPos; @@ -7,12 +6,45 @@ in vec4 vPos; out vec4 fragColor; +// Fog Uniforms +uniform float fogScale; +uniform float fogVerticalScale; +uniform float nearFogStart; +uniform float nearFogLength; +uniform int fullFogMode; + // Noise Uniforms uniform bool noiseEnabled; uniform int noiseSteps; uniform float noiseIntensity; uniform int noiseDropoff; +/* ========MARCO DEFINED BY RUNTIME CODE GEN========= + +float farFogStart; +float farFogLength; +float farFogMin; +float farFogRange; +float farFogDensity; + +float heightFogStart; +float heightFogLength; +float heightFogMin; +float heightFogRange; +float heightFogDensity; +*/ + +uniform vec4 fogColor; + +// method definitions +// ==== The below 5 methods will be run-time generated. ==== +float getNearFogThickness(float dist); +float getFarFogThickness(float dist); +float getHeightFogThickness(float dist); +float calculateFarFogDepth(float horizontal, float dist, float nearFogStart); +float calculateHeightFogDepth(float vertical, float realY); +float mixFogThickness(float near, float far, float height); +// ========================================================= float fade(float value, float start, float end) { return (clamp(value,start,end)-start)/(end-start); @@ -64,7 +96,7 @@ vec3 HSV2RGB(vec3 c) { */ void main() { - fragColor = vertexColor; + fragColor = vertexColor; // TODO: Move into its own function instead of in an if statement @@ -72,9 +104,9 @@ void main() vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable vec3 fixedVPos = vec3( - vPos.x - vertexNormal.x * 0.001, - vPos.y - vertexNormal.y * 0.001, - vPos.z - vertexNormal.z * 0.001 + vPos.x - vertexNormal.x * 0.001, + vPos.y - vertexNormal.y * 0.001, + vPos.z - vertexNormal.z * 0.001 ); @@ -84,9 +116,9 @@ void main() // Random value for each position float randomValue = rand(vec3( - quantize(fixedVPos.x, noiseSteps), - quantize(fixedVPos.y, noiseSteps), - quantize(fixedVPos.z, noiseSteps) + quantize(fixedVPos.x, noiseSteps), + quantize(fixedVPos.y, noiseSteps), + quantize(fixedVPos.z, noiseSteps) )) * 2. * noiseAmplification - noiseAmplification; @@ -97,22 +129,22 @@ void main() // Clamps it and turns it back into a vec4 if (noiseDropoff == 0) - fragColor = vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - fragColor.w - ); + fragColor = vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ); else - fragColor = mix( - vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - fragColor.w - ), fragColor, - clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied - ); + fragColor = mix( + vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ), fragColor, + clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied + ); // For testing // if (fragColor.r != 69420.) { @@ -123,4 +155,48 @@ void main() // fragColor.w); // } } + + // TODO: Move into its own function instead of in an if statement + // This is so that it can apply after the SSAO (work for this has started in the FogShader file and fog/fog.frag shader) + if (fullFogMode != 0) { + fragColor = vec4(fogColor.rgb, 1.0); + } else { + // TODO: add a white texture to support Optifine shaders + //vec4 textureColor = texture(texImage, textureCoord); + //fragColor = vertexColor * textureColor; + + float horizontalDist = length(vertexWorldPos.xz) * fogScale; + float heightDist = calculateHeightFogDepth( + vertexWorldPos.y, vertexYPos) * fogVerticalScale; + float farDist = calculateFarFogDepth(horizontalDist, + length(vertexWorldPos.xyz) * fogScale, nearFogStart); + + float nearFogThickness = getNearFogThickness(horizontalDist); + float farFogThickness = getFarFogThickness(farDist); + float heightFogThickness = getHeightFogThickness(heightDist); + float mixedFogThickness = clamp(mixFogThickness( + nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); + + fragColor = mix(fragColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); + } +} + + + +// Are these still needed? +float linearFog(float x, float fogStart, float fogLength, float fogMin, float fogRange) { + x = clamp((x-fogStart)/fogLength, 0.0, 1.0); + return fogMin + fogRange * x; +} + +float exponentialFog(float x, float fogStart, float fogLength, +float fogMin, float fogRange, float fogDensity) { + x = max((x-fogStart)/fogLength, 0.0) * fogDensity; + return fogMin + fogRange - fogRange/exp(x); +} + +float exponentialSquaredFog(float x, float fogStart, float fogLength, +float fogMin, float fogRange, float fogDensity) { + x = max((x-fogStart)/fogLength, 0.0) * fogDensity; + return fogMin + fogRange - fogRange/exp(x*x); } \ No newline at end of file From 783ceeb6332d7f522c2c90617616457305cd2488 Mon Sep 17 00:00:00 2001 From: coolGi Date: Sat, 5 Aug 2023 16:53:41 +0930 Subject: [PATCH 8/8] Some general fixes --- Readme.md | 2 +- .../core/jar/gui/BaseJFrame.java | 9 ++-- .../assets/distanthorizons/lang/en_us.json | 2 +- .../main/resources/shaders/flat_shaded.frag | 48 +++++++++---------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Readme.md b/Readme.md index ba593171f..668aca089 100644 --- a/Readme.md +++ b/Readme.md @@ -17,7 +17,7 @@ It should be automatically included when pulling the full mod. LZ4 for Java (data compression)\ https://github.com/lz4/lz4-java -Json & Toml for Java (config handling)\ +NightConfig for Json & Toml (config handling)\ https://github.com/TheElectronWill/night-config SVG Salamander for SVG's\ diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java index 546e860ab..344d792dd 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java @@ -59,7 +59,7 @@ public class BaseJFrame extends JFrame { // Creates a list with all the options in it List langsToChoose = new ArrayList<>(); try( - final InputStreamReader isr = new InputStreamReader(JarUtils.accessFile("assets/lod/lang"), StandardCharsets.UTF_8); + final InputStreamReader isr = new InputStreamReader(JarUtils.accessFile("assets/distanthorizons/lang"), StandardCharsets.UTF_8); final BufferedReader br = new BufferedReader(isr) ) { List col = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(br.lines().toArray()))); @@ -87,11 +87,11 @@ public class BaseJFrame extends JFrame { // Try to set the icons for them try { lightMode = new JButton(new ImageIcon( - new FlatSVGIcon(JarUtils.accessFile("assets/lod/textures/jar/themeLight.svg")).getImage() // Get the image + new FlatSVGIcon(JarUtils.accessFile("assets/distanthorizons/textures/jar/themeLight.svg")).getImage() // Get the image .getScaledInstance(themeButtonSize, themeButtonSize, Image.SCALE_DEFAULT) // Scale it to the correct size )); darkMode = new JButton(new ImageIcon( - new FlatSVGIcon(JarUtils.accessFile("assets/lod/textures/jar/themeDark.svg")).getImage() // Get the image + new FlatSVGIcon(JarUtils.accessFile("assets/distanthorizons/textures/jar/themeDark.svg")).getImage() // Get the image .getScaledInstance(themeButtonSize, themeButtonSize, Image.SCALE_DEFAULT) // Scale it to the correct size )); } catch (Exception e) {e.printStackTrace();} @@ -139,8 +139,7 @@ public class BaseJFrame extends JFrame { // This part of the code is taken from the official java docs at https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html // Specify the look and feel to use by defining the LOOKANDFEEL constant - // Valid values are: null (use the default), "Metal", "System", "Motif", - // and "GTK" + // Valid values are: null (use the default), "Metal", "System", "Motif", and "GTK" final static String LOOKANDFEEL = "GTK"; private static void initLookAndFeel() { String lookAndFeel = null; diff --git a/core/src/main/resources/assets/distanthorizons/lang/en_us.json b/core/src/main/resources/assets/distanthorizons/lang/en_us.json index c4da69c7b..1bdabf28d 100644 --- a/core/src/main/resources/assets/distanthorizons/lang/en_us.json +++ b/core/src/main/resources/assets/distanthorizons/lang/en_us.json @@ -224,7 +224,7 @@ "distanthorizons.config.client.advanced.graphics.noiseTextureSettings.noiseDropoff": "Noise Dropoff", "distanthorizons.config.client.advanced.graphics.noiseTextureSettings.noiseDropoff.@tooltip": - "How far should the noise texture render before it fades away? \n\n0.0 - the noise texture will render the entire LOD render distance. \n3.0 - the noise texture will fade away at 1/3 of the LOD render distance. ", + "Defines how far should the noise texture render before it fades away. (in blocks). \nSet to 0 to disable noise from fading away.", "distanthorizons.config.client.advanced.graphics.advancedGraphics": diff --git a/core/src/main/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index 0252c0b4c..99a6b47ec 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -104,9 +104,9 @@ void main() vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable vec3 fixedVPos = vec3( - vPos.x - vertexNormal.x * 0.001, - vPos.y - vertexNormal.y * 0.001, - vPos.z - vertexNormal.z * 0.001 + vPos.x - vertexNormal.x * 0.001, + vPos.y - vertexNormal.y * 0.001, + vPos.z - vertexNormal.z * 0.001 ); @@ -116,9 +116,9 @@ void main() // Random value for each position float randomValue = rand(vec3( - quantize(fixedVPos.x, noiseSteps), - quantize(fixedVPos.y, noiseSteps), - quantize(fixedVPos.z, noiseSteps) + quantize(fixedVPos.x, noiseSteps), + quantize(fixedVPos.y, noiseSteps), + quantize(fixedVPos.z, noiseSteps) )) * 2. * noiseAmplification - noiseAmplification; @@ -129,22 +129,22 @@ void main() // Clamps it and turns it back into a vec4 if (noiseDropoff == 0) - fragColor = vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - fragColor.w - ); + fragColor = vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ); else - fragColor = mix( - vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - fragColor.w - ), fragColor, - clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied - ); + fragColor = mix( + vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ), fragColor, + clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied + ); // For testing // if (fragColor.r != 69420.) { @@ -167,15 +167,15 @@ void main() float horizontalDist = length(vertexWorldPos.xz) * fogScale; float heightDist = calculateHeightFogDepth( - vertexWorldPos.y, vertexYPos) * fogVerticalScale; + vertexWorldPos.y, vertexYPos) * fogVerticalScale; float farDist = calculateFarFogDepth(horizontalDist, - length(vertexWorldPos.xyz) * fogScale, nearFogStart); + length(vertexWorldPos.xyz) * fogScale, nearFogStart); float nearFogThickness = getNearFogThickness(horizontalDist); float farFogThickness = getFarFogThickness(farDist); float heightFogThickness = getHeightFogThickness(heightDist); float mixedFogThickness = clamp(mixFogThickness( - nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); + nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); fragColor = mix(fragColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); }