Fix floating point precision issue in the fog gradient calculation, which lead to weird black lines.

fixes #1034
This commit is contained in:
IntegratedQuantum 2025-02-19 19:18:03 +01:00
parent 1bcd5095da
commit 5d37993132
3 changed files with 4 additions and 5 deletions

View File

@ -80,7 +80,7 @@ vec3 fetch(ivec2 pos) {
vec4 rgba = texelFetch(color, pos, 0);
float densityAdjustment = sqrt(dot(tanXY*(normalizedTexCoords*2 - 1), tanXY*(normalizedTexCoords*2 - 1)) + 1);
float dist = zFromDepth(texelFetch(depthTexture, pos, 0).r);
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionInteger.z + playerPositionFraction.z, normalize(direction).z, fog.density, fog.fogLower, fog.fogHigher);
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionFraction.z, normalize(direction).z, fog.density, fog.fogLower - playerPositionInteger.z, fog.fogHigher - playerPositionInteger.z);
vec3 fogColor = fog.color;
rgba.rgb = applyFrontfaceFog(fogDistance, fog.color, rgba.rgb);
return rgba.rgb/rgba.a;

View File

@ -137,9 +137,8 @@ void main() {
float normalVariation = lightVariation(normal);
float densityAdjustment = sqrt(dot(mvVertexPos, mvVertexPos))/abs(mvVertexPos.y);
float dist = zFromDepth(texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r);
float playerZ = playerPositionFraction.z + playerPositionInteger.z;
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerZ, normalize(direction).z, fogData[int(animatedTextureIndex)].fogDensity, 1e10, 1e10);
float airFogDistance = calculateFogDistance(dist, densityAdjustment, playerZ, normalize(direction).z, fog.density, fog.fogLower, fog.fogHigher);
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionFraction.z, normalize(direction).z, fogData[int(animatedTextureIndex)].fogDensity, 1e10, 1e10);
float airFogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionFraction.z, normalize(direction).z, fog.density, fog.fogLower - playerPositionInteger.z, fog.fogHigher - playerPositionInteger.z);
vec3 fogColor = unpackColor(fogData[int(animatedTextureIndex)].fogColor);
vec3 pixelLight = max(light*normalVariation, texture(emissionSampler, textureCoords).r*4);
vec4 textureColor = texture(texture_sampler, textureCoords)*vec4(pixelLight, 1);

View File

@ -86,7 +86,7 @@ void main() {
);
float densityAdjustment = sqrt(dot(tanXY*(clampedTexCoords*2 - 1), tanXY*(clampedTexCoords*2 - 1)) + 1);
float dist = zFromDepth(texture(depthTexture, texCoords).r);
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionInteger.z + playerPositionFraction.z, normalize(direction).z, fog.density, fog.fogLower, fog.fogHigher);
float fogDistance = calculateFogDistance(dist, densityAdjustment, playerPositionFraction.z, normalize(direction).z, fog.density, fog.fogLower - playerPositionInteger.z, fog.fogHigher - playerPositionInteger.z);
fragColor.rgb = applyFrontfaceFog(fogDistance, fog.color, fragColor.rgb);
float maxColor = max(1.0, max(fragColor.r, max(fragColor.g, fragColor.b)));
fragColor.rgb = fragColor.rgb/maxColor;