The fog now uses the correct distance instead of only using the z component.

This commit is contained in:
IntegratedQuantum 2023-09-12 18:25:42 +02:00
parent a4bef7d4be
commit 4a84b862b5
4 changed files with 20 additions and 13 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}