From 4a84b862b5f4b99b4d4aa7c34978c253f3ab9e6c Mon Sep 17 00:00:00 2001 From: IntegratedQuantum Date: Tue, 12 Sep 2023 18:25:42 +0200 Subject: [PATCH] The fog now uses the correct distance instead of only using the z component. --- .../shaders/bloom/color_extractor_downsample.fs | 4 +++- assets/cubyz/shaders/chunks/transparent_fragment.fs | 13 ++++++------- assets/cubyz/shaders/deferred_render_pass.fs | 4 +++- src/renderer.zig | 12 ++++++++---- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/assets/cubyz/shaders/bloom/color_extractor_downsample.fs b/assets/cubyz/shaders/bloom/color_extractor_downsample.fs index 14f6e20b..c09e512b 100644 --- a/assets/cubyz/shaders/bloom/color_extractor_downsample.fs +++ b/assets/cubyz/shaders/bloom/color_extractor_downsample.fs @@ -8,6 +8,7 @@ layout(binding = 3) uniform sampler2D color; uniform sampler2D depthTexture; uniform float nearPlane; +uniform vec2 tanXY; struct Fog { vec3 color; @@ -38,7 +39,8 @@ float calculateFogDistance(float depthBufferValue, float fogDensity) { vec3 fetch(ivec2 pos) { vec4 rgba = texelFetch(color, pos, 0); - float fogDistance = calculateFogDistance(texelFetch(depthTexture, pos, 0).r, fog.density); + float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); + float fogDistance = calculateFogDistance(texelFetch(depthTexture, pos, 0).r, fog.density*densityAdjustment); vec3 fogColor = fog.color; float fogFactor = exp(fogDistance); vec4 sourceColor = vec4(fogColor, 1); diff --git a/assets/cubyz/shaders/chunks/transparent_fragment.fs b/assets/cubyz/shaders/chunks/transparent_fragment.fs index 8ae88fca..ecfae352 100644 --- a/assets/cubyz/shaders/chunks/transparent_fragment.fs +++ b/assets/cubyz/shaders/chunks/transparent_fragment.fs @@ -142,10 +142,9 @@ float calculateFogDistance(float depthBufferValue, float fogDensity) { void applyFrontfaceFog(float fogDistance, vec3 fogColor) { float fogFactor = exp(fogDistance); - float oldAlpha = fragColor.a; - fragColor.a *= 1.0/fogFactor; - fragColor.rgb += fragColor.a*fogColor; - fragColor.rgb -= oldAlpha*fogColor; + fragColor.a = 1.0/fogFactor; + fragColor.rgb = fragColor.a*fogColor; + fragColor.rgb -= fogColor; } void applyBackfaceFog(float fogDistance, vec3 fogColor) { @@ -177,10 +176,10 @@ void main() { int textureIndex = textureData[blockType].textureIndices[faceNormal]; textureIndex = textureIndex + time / animation[textureIndex].time % animation[textureIndex].frames; float normalVariation = normalVariations[faceNormal]; - float fogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, textureData[blockType].fogDensity); - float airFogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, fog.density); + float densityAdjustment = sqrt(dot(mvVertexPos, mvVertexPos))/abs(mvVertexPos.z); + float fogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, textureData[blockType].fogDensity*densityAdjustment); + float airFogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, fog.density*densityAdjustment); vec3 fogColor = unpackColor(textureData[blockType].fogColor); - fragColor = vec4(0, 0, 0, 1); if(isBackFace == 0) { vec4 textureColor = texture(texture_sampler, vec3(getTextureCoordsNormal(startPosition/16, faceNormal), textureIndex))*vec4(ambientLight*normalVariation, 1); diff --git a/assets/cubyz/shaders/deferred_render_pass.fs b/assets/cubyz/shaders/deferred_render_pass.fs index 7c9a262c..1f1470c9 100644 --- a/assets/cubyz/shaders/deferred_render_pass.fs +++ b/assets/cubyz/shaders/deferred_render_pass.fs @@ -7,6 +7,7 @@ uniform sampler2D color; uniform sampler2D depthTexture; uniform float nearPlane; +uniform vec2 tanXY; struct Fog { vec3 color; @@ -37,7 +38,8 @@ float calculateFogDistance(float depthBufferValue, float fogDensity) { void main() { fragColor = texture(color, texCoords); - float fogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, fog.density); + float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); + float fogDistance = calculateFogDistance(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r, fog.density*densityAdjustment); vec3 fogColor = fog.color; float fogFactor = exp(fogDistance); vec4 sourceColor = vec4(fogColor, 1); diff --git a/src/renderer.zig b/src/renderer.zig index c65cb60f..0de51e63 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -35,6 +35,7 @@ var deferredUniforms: struct { depthTexture: c_int, @"fog.color": c_int, @"fog.density": c_int, + tanXY: c_int, nearPlane: c_int, } = undefined; @@ -235,6 +236,7 @@ pub fn renderWorld(world: *World, ambientLight: Vec3f, skyColor: Vec3f, playerPo c.glUniform1f(deferredUniforms.@"fog.density", blocks.meshes.fogDensity(playerBlock)); } c.glUniform1f(deferredUniforms.nearPlane, zNear); + c.glUniform2f(deferredUniforms.tanXY, 1.0/game.projectionMatrix.columns[0][0], 1.0/game.projectionMatrix.columns[1][1]); c.glBindFramebuffer(c.GL_FRAMEBUFFER, activeFrameBuffer); @@ -268,6 +270,7 @@ const Bloom = struct { var colorExtractUniforms: struct { depthTexture: c_int, nearPlane: c_int, + tanXY: c_int, @"fog.color": c_int, @"fog.density": c_int, } = undefined; @@ -296,14 +299,15 @@ const Bloom = struct { buffer1.bind(); c.glUniform1i(colorExtractUniforms.depthTexture, 4); if(playerBlock.typ == 0) { - c.glUniform3fv(deferredUniforms.@"fog.color", 1, @ptrCast(&game.fog.color)); - c.glUniform1f(deferredUniforms.@"fog.density", game.fog.density); + c.glUniform3fv(colorExtractUniforms.@"fog.color", 1, @ptrCast(&game.fog.color)); + c.glUniform1f(colorExtractUniforms.@"fog.density", game.fog.density); } else { const fogColor = blocks.meshes.fogColor(playerBlock); - c.glUniform3f(deferredUniforms.@"fog.color", @as(f32, @floatFromInt(fogColor >> 16 & 255))/255.0, @as(f32, @floatFromInt(fogColor >> 8 & 255))/255.0, @as(f32, @floatFromInt(fogColor >> 0 & 255))/255.0); - c.glUniform1f(deferredUniforms.@"fog.density", blocks.meshes.fogDensity(playerBlock)); + c.glUniform3f(colorExtractUniforms.@"fog.color", @as(f32, @floatFromInt(fogColor >> 16 & 255))/255.0, @as(f32, @floatFromInt(fogColor >> 8 & 255))/255.0, @as(f32, @floatFromInt(fogColor >> 0 & 255))/255.0); + c.glUniform1f(colorExtractUniforms.@"fog.density", blocks.meshes.fogDensity(playerBlock)); } c.glUniform1f(colorExtractUniforms.nearPlane, zNear); + c.glUniform2f(colorExtractUniforms.tanXY, 1.0/game.projectionMatrix.columns[0][0], 1.0/game.projectionMatrix.columns[1][1]); c.glBindVertexArray(graphics.draw.rectVAO); c.glDrawArrays(c.GL_TRIANGLE_STRIP, 0, 4); }