From 0ad40fd484f57ab5d0536f9aaa892997f8aa9bd2 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Wed, 12 Oct 2016 13:38:53 -0700 Subject: Use range-based fog instead of z-plane based. --- client/shaders/nodes_shader/opengl_fragment.glsl | 4 ++-- client/shaders/water_surface_shader/opengl_fragment.glsl | 4 ++-- client/shaders/wielded_shader/opengl_fragment.glsl | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'client') diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 6862842a7..654b1396d 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -197,13 +197,13 @@ void main(void) #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT float alpha = gl_Color.a; if (fogDistance != 0.0) { - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); alpha = mix(alpha, 0.0, d); } col = vec4(col.rgb, alpha); #else if (fogDistance != 0.0) { - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); col = mix(col, skyBgColor, d); } col = vec4(col.rgb, base.a); diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index 1fa669541..1aa721f83 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -153,13 +153,13 @@ vec4 base = texture2D(baseTexture, uv).rgba; #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE float alpha = gl_Color.a; if (fogDistance != 0.0) { - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); alpha = mix(alpha, 0.0, d); } col = vec4(col.rgb, alpha); #else if (fogDistance != 0.0) { - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); col = mix(col, skyBgColor, d); } col = vec4(col.rgb, base.a); diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index 75dd1b674..afb8cc32d 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -107,7 +107,7 @@ void main(void) vec4 col = vec4(color.rgb, base.a); col *= gl_Color; if (fogDistance != 0.0) { - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); col = mix(col, skyBgColor, d); } gl_FragColor = vec4(col.rgb, base.a); -- cgit v1.2.3 From 779d2c5f64e321cc126b3e3abed9e37fd30edb1b Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Thu, 20 Oct 2016 22:21:49 -0700 Subject: Shaders: Harmonize Irrlicht and shader fog calculations --- client/shaders/nodes_shader/opengl_fragment.glsl | 8 ++++---- client/shaders/water_surface_shader/opengl_fragment.glsl | 8 ++++---- client/shaders/wielded_shader/opengl_fragment.glsl | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'client') diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 654b1396d..299de2749 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -197,14 +197,14 @@ void main(void) #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT float alpha = gl_Color.a; if (fogDistance != 0.0) { - float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); - alpha = mix(alpha, 0.0, d); + float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); + alpha = mix(0.0, alpha, d); } col = vec4(col.rgb, alpha); #else if (fogDistance != 0.0) { - float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); - col = mix(col, skyBgColor, d); + float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); + col = mix(skyBgColor, col, d); } col = vec4(col.rgb, base.a); #endif diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index 1aa721f83..8321ddf93 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -153,14 +153,14 @@ vec4 base = texture2D(baseTexture, uv).rgba; #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE float alpha = gl_Color.a; if (fogDistance != 0.0) { - float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); - alpha = mix(alpha, 0.0, d); + float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); + alpha = mix(0.0, alpha, d); } col = vec4(col.rgb, alpha); #else if (fogDistance != 0.0) { - float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); - col = mix(col, skyBgColor, d); + float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); + col = mix(skyBgColor, col, d); } col = vec4(col.rgb, base.a); #endif diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index afb8cc32d..bd9741441 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -107,8 +107,8 @@ void main(void) vec4 col = vec4(color.rgb, base.a); col *= gl_Color; if (fogDistance != 0.0) { - float d = max(0.0, min(length(eyeVec) / fogDistance * 1.5 - 0.6, 1.0)); - col = mix(col, skyBgColor, d); + float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); + col = mix(skyBgColor, col, d); } gl_FragColor = vec4(col.rgb, base.a); } -- cgit v1.2.3 From 98176481c1d0b6f8960574af1c2568085e37e433 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Mon, 24 Oct 2016 08:23:13 -0700 Subject: Shaders: Apply tone mapping before fog calculation. --- client/shaders/nodes_shader/opengl_fragment.glsl | 8 ++++---- client/shaders/water_surface_shader/opengl_fragment.glsl | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'client') diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 299de2749..09c40b652 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -194,6 +194,10 @@ void main(void) vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); +#ifdef ENABLE_TONE_MAPPING + col = applyToneMapping(col); +#endif + #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT float alpha = gl_Color.a; if (fogDistance != 0.0) { @@ -209,9 +213,5 @@ void main(void) col = vec4(col.rgb, base.a); #endif -#ifdef ENABLE_TONE_MAPPING - gl_FragColor = applyToneMapping(col); -#else gl_FragColor = col; -#endif } diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index 8321ddf93..d910220e9 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -150,6 +150,10 @@ vec4 base = texture2D(baseTexture, uv).rgba; vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); +#ifdef ENABLE_TONE_MAPPING + col = applyToneMapping(col); +#endif + #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE float alpha = gl_Color.a; if (fogDistance != 0.0) { @@ -165,9 +169,5 @@ vec4 base = texture2D(baseTexture, uv).rgba; col = vec4(col.rgb, base.a); #endif -#ifdef ENABLE_TONE_MAPPING - gl_FragColor = applyToneMapping(col); -#else gl_FragColor = col; -#endif } -- cgit v1.2.3 From 198ed60cabd3066977df5360b7b32a6b895ea744 Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Wed, 26 Oct 2016 07:24:45 -0700 Subject: Shaders: Remove special handling for liquids. (#4670) --- client/shaders/nodes_shader/opengl_fragment.glsl | 9 --------- client/shaders/water_surface_shader/opengl_fragment.glsl | 9 --------- 2 files changed, 18 deletions(-) (limited to 'client') diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 09c40b652..4d9ce1c12 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -198,20 +198,11 @@ void main(void) col = applyToneMapping(col); #endif -#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT - float alpha = gl_Color.a; - if (fogDistance != 0.0) { - float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); - alpha = mix(0.0, alpha, d); - } - col = vec4(col.rgb, alpha); -#else if (fogDistance != 0.0) { float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); col = mix(skyBgColor, col, d); } col = vec4(col.rgb, base.a); -#endif gl_FragColor = col; } diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index d910220e9..b4c0cc4f8 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -154,20 +154,11 @@ vec4 base = texture2D(baseTexture, uv).rgba; col = applyToneMapping(col); #endif -#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE - float alpha = gl_Color.a; - if (fogDistance != 0.0) { - float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); - alpha = mix(0.0, alpha, d); - } - col = vec4(col.rgb, alpha); -#else if (fogDistance != 0.0) { float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); col = mix(skyBgColor, col, d); } col = vec4(col.rgb, base.a); -#endif gl_FragColor = col; } -- cgit v1.2.3 From 6bb43472082d8003a6cd140c1221c81005fdd752 Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Fri, 4 Nov 2016 10:12:45 -0700 Subject: Remove unused shader matrices. (#4723) --- client/shaders/minimap_shader/opengl_vertex.glsl | 2 -- client/shaders/nodes_shader/opengl_vertex.glsl | 2 -- client/shaders/water_surface_shader/opengl_vertex.glsl | 2 -- client/shaders/wielded_shader/opengl_vertex.glsl | 2 -- src/shader.cpp | 16 ---------------- 5 files changed, 24 deletions(-) (limited to 'client') diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl index 06df5a3cf..88f9356d5 100644 --- a/client/shaders/minimap_shader/opengl_vertex.glsl +++ b/client/shaders/minimap_shader/opengl_vertex.glsl @@ -1,6 +1,4 @@ uniform mat4 mWorldViewProj; -uniform mat4 mInvWorld; -uniform mat4 mTransWorld; uniform mat4 mWorld; void main(void) diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 28c5f197e..44c48cc4c 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,6 +1,4 @@ uniform mat4 mWorldViewProj; -uniform mat4 mInvWorld; -uniform mat4 mTransWorld; uniform mat4 mWorld; uniform float dayNightRatio; diff --git a/client/shaders/water_surface_shader/opengl_vertex.glsl b/client/shaders/water_surface_shader/opengl_vertex.glsl index 9b461f4c1..a930e7b8f 100644 --- a/client/shaders/water_surface_shader/opengl_vertex.glsl +++ b/client/shaders/water_surface_shader/opengl_vertex.glsl @@ -1,6 +1,4 @@ uniform mat4 mWorldViewProj; -uniform mat4 mInvWorld; -uniform mat4 mTransWorld; uniform mat4 mWorld; uniform float dayNightRatio; diff --git a/client/shaders/wielded_shader/opengl_vertex.glsl b/client/shaders/wielded_shader/opengl_vertex.glsl index c33b0a7d3..86c626896 100644 --- a/client/shaders/wielded_shader/opengl_vertex.glsl +++ b/client/shaders/wielded_shader/opengl_vertex.glsl @@ -1,6 +1,4 @@ uniform mat4 mWorldViewProj; -uniform mat4 mInvWorld; -uniform mat4 mTransWorld; uniform mat4 mWorld; uniform float dayNightRatio; diff --git a/src/shader.cpp b/src/shader.cpp index e13ab8df3..b0131c952 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -219,14 +219,6 @@ public: video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver); - // set inverted world matrix - core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD); - invWorld.makeInverse(); - if(is_highlevel) - services->setVertexShaderConstant("mInvWorld", invWorld.pointer(), 16); - else - services->setVertexShaderConstant(invWorld.pointer(), 0, 4); - // set clip matrix core::matrix4 worldViewProj; worldViewProj = driver->getTransform(video::ETS_PROJECTION); @@ -237,14 +229,6 @@ public: else services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4); - // set transposed world matrix - core::matrix4 transWorld = driver->getTransform(video::ETS_WORLD); - transWorld = transWorld.getTransposed(); - if(is_highlevel) - services->setVertexShaderConstant("mTransWorld", transWorld.pointer(), 16); - else - services->setVertexShaderConstant(transWorld.pointer(), 8, 4); - // set world matrix core::matrix4 world = driver->getTransform(video::ETS_WORLD); if(is_highlevel) -- cgit v1.2.3 From 5f0dc8e78ad7e62959786efd5c7f72044aacb53a Mon Sep 17 00:00:00 2001 From: Rogier-5 Date: Wed, 16 Nov 2016 17:56:05 +0100 Subject: Fix unexplained shader issue (glsl compiler bug??) (#4757) --- client/shaders/nodes_shader/opengl_fragment.glsl | 16 ++++++++++++++-- client/shaders/water_surface_shader/opengl_fragment.glsl | 16 ++++++++++++++-- client/shaders/wielded_shader/opengl_fragment.glsl | 16 ++++++++++++++-- 3 files changed, 42 insertions(+), 6 deletions(-) (limited to 'client') diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 4d9ce1c12..149aa2bc5 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -19,6 +19,8 @@ bool normalTexturePresent = false; const float e = 2.718281828459; const float BS = 10.0; +const float fogStart = 0.4; +const float fogShadingParameter = 1 / ( 1 - fogStart); #ifdef ENABLE_TONE_MAPPING @@ -199,8 +201,18 @@ void main(void) #endif if (fogDistance != 0.0) { - float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); - col = mix(skyBgColor, col, d); + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); } col = vec4(col.rgb, base.a); diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index b4c0cc4f8..4164870c7 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -21,6 +21,8 @@ bool texSeamless = false; const float e = 2.718281828459; const float BS = 10.0; +const float fogStart = 0.4; +const float fogShadingParameter = 1 / ( 1 - fogStart); #ifdef ENABLE_TONE_MAPPING @@ -155,8 +157,18 @@ vec4 base = texture2D(baseTexture, uv).rgba; #endif if (fogDistance != 0.0) { - float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); - col = mix(skyBgColor, col, d); + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); } col = vec4(col.rgb, base.a); diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index bd9741441..7c38b749a 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -19,6 +19,8 @@ bool texSeamless = false; const float e = 2.718281828459; const float BS = 10.0; +const float fogStart = 0.4; +const float fogShadingParameter = 1 / ( 1 - fogStart); void get_texture_flags() { @@ -107,8 +109,18 @@ void main(void) vec4 col = vec4(color.rgb, base.a); col *= gl_Color; if (fogDistance != 0.0) { - float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0); - col = mix(skyBgColor, col, d); + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); } gl_FragColor = vec4(col.rgb, base.a); } -- cgit v1.2.3 From 075833e39368e63e06889f21140f816420e83541 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Sat, 3 Dec 2016 21:43:25 -0800 Subject: Fog: Make fraction of visible distance at which fog starts configurable Optimise the fetching of global settings 'camera_smoothing', 'cinematic' and 'cinematic_camera_smoothing'. Cache 'cam_smoothing'. --- builtin/settingtypes.txt | 3 ++ client/shaders/nodes_shader/opengl_fragment.glsl | 2 +- .../water_surface_shader/opengl_fragment.glsl | 2 +- client/shaders/wielded_shader/opengl_fragment.glsl | 2 +- minetest.conf.example | 4 +++ src/defaultsettings.cpp | 1 + src/game.cpp | 37 ++++++++++++++++------ src/shader.cpp | 4 +++ 8 files changed, 43 insertions(+), 12 deletions(-) (limited to 'client') diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index b1f31054e..10db4787d 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -529,6 +529,9 @@ ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0 # Enables animation of inventory items. inventory_items_animations (Inventory items animations) bool false +# Fraction of the visible distance at which fog starts to be rendered +fog_start (Fog Start) float 0.4 0.0 0.99 + [**Menus] # Use a cloud animation for the main menu background. diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 149aa2bc5..71ded2b9d 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -19,7 +19,7 @@ bool normalTexturePresent = false; const float e = 2.718281828459; const float BS = 10.0; -const float fogStart = 0.4; +const float fogStart = FOG_START; const float fogShadingParameter = 1 / ( 1 - fogStart); #ifdef ENABLE_TONE_MAPPING diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index 4164870c7..c4e78470d 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -21,7 +21,7 @@ bool texSeamless = false; const float e = 2.718281828459; const float BS = 10.0; -const float fogStart = 0.4; +const float fogStart = FOG_START; const float fogShadingParameter = 1 / ( 1 - fogStart); #ifdef ENABLE_TONE_MAPPING diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index 7c38b749a..ba7a8f12d 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -19,7 +19,7 @@ bool texSeamless = false; const float e = 2.718281828459; const float BS = 10.0; -const float fogStart = 0.4; +const float fogStart = FOG_START; const float fogShadingParameter = 1 / ( 1 - fogStart); void get_texture_flags() diff --git a/minetest.conf.example b/minetest.conf.example index 361311ba0..90d7af0a3 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -615,6 +615,10 @@ # type: bool # inventory_items_animations = false +# Fraction of the visible distance at which fog starts to be rendered +# Range 0 - 0.99 +# fog_start = 0.4 + ### Menus # Use a cloud animation for the main menu background. diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 2cb57532d..bd88cf530 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -106,6 +106,7 @@ void set_default_settings(Settings *settings) settings->setDefault("client_unload_unused_data_timeout", "600"); settings->setDefault("client_mapblock_limit", "5000"); settings->setDefault("enable_fog", "true"); + settings->setDefault("fog_start", "0.4"); settings->setDefault("fov", "72"); settings->setDefault("view_bobbing", "true"); settings->setDefault("leaves_style", "fancy"); diff --git a/src/game.cpp b/src/game.cpp index e6d38d0a0..cc6e5a0e3 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1825,6 +1825,8 @@ private: f32 m_cache_mouse_sensitivity; f32 m_cache_joystick_frustum_sensitivity; f32 m_repeat_right_click_time; + f32 m_cache_cam_smoothing; + f32 m_cache_fog_start; #ifdef __ANDROID__ bool m_cache_hold_aux1; @@ -1876,6 +1878,12 @@ Game::Game() : &settingChangedCallback, this); g_settings->registerChangedCallback("free_move", &settingChangedCallback, this); + g_settings->registerChangedCallback("cinematic", + &settingChangedCallback, this); + g_settings->registerChangedCallback("cinematic_camera_smoothing", + &settingChangedCallback, this); + g_settings->registerChangedCallback("camera_smoothing", + &settingChangedCallback, this); readSettings(); @@ -1929,6 +1937,12 @@ Game::~Game() &settingChangedCallback, this); g_settings->deregisterChangedCallback("free_move", &settingChangedCallback, this); + g_settings->deregisterChangedCallback("cinematic", + &settingChangedCallback, this); + g_settings->deregisterChangedCallback("cinematic_camera_smoothing", + &settingChangedCallback, this); + g_settings->deregisterChangedCallback("camera_smoothing", + &settingChangedCallback, this); } bool Game::startup(bool *kill, @@ -2034,16 +2048,10 @@ void Game::run() processUserInput(&flags, &runData, dtime); // Update camera before player movement to avoid camera lag of one frame updateCameraDirection(&cam_view_target, &flags, dtime); - float cam_smoothing = 0; - if (g_settings->getBool("cinematic")) - cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing"); - else - cam_smoothing = 1 - g_settings->getFloat("camera_smoothing"); - cam_smoothing = rangelim(cam_smoothing, 0.01f, 1.0f); cam_view.camera_yaw += (cam_view_target.camera_yaw - - cam_view.camera_yaw) * cam_smoothing; + cam_view.camera_yaw) * m_cache_cam_smoothing; cam_view.camera_pitch += (cam_view_target.camera_pitch - - cam_view.camera_pitch) * cam_smoothing; + cam_view.camera_pitch) * m_cache_cam_smoothing; updatePlayerControl(cam_view); step(&dtime); processClientEvents(&cam_view_target, &runData.damage_flash); @@ -4284,7 +4292,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, driver->setFog( sky->getBgColor(), video::EFT_FOG_LINEAR, - runData->fog_range * 0.4, + runData->fog_range * m_cache_fog_start, runData->fog_range * 1.0, 0.01, false, // pixel fog @@ -4660,7 +4668,18 @@ void Game::readSettings() m_cache_enable_noclip = g_settings->getBool("noclip"); m_cache_enable_free_move = g_settings->getBool("free_move"); + m_cache_fog_start = g_settings->getFloat("fog_start"); + + m_cache_cam_smoothing = 0; + if (g_settings->getBool("cinematic")) + m_cache_cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing"); + else + m_cache_cam_smoothing = 1 - g_settings->getFloat("camera_smoothing"); + + m_cache_fog_start = rangelim(m_cache_fog_start, 0.0f, 0.99f); + m_cache_cam_smoothing = rangelim(m_cache_cam_smoothing, 0.01f, 1.0f); m_cache_mouse_sensitivity = rangelim(m_cache_mouse_sensitivity, 0.001, 100.0); + } /****************************************************************************/ diff --git a/src/shader.cpp b/src/shader.cpp index d51c1e308..c0ecf738d 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -751,6 +751,10 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype, if (g_settings->getBool("tone_mapping")) shaders_header += "#define ENABLE_TONE_MAPPING\n"; + shaders_header += "#define FOG_START "; + shaders_header += ftos(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f)); + shaders_header += "\n"; + // Call addHighLevelShaderMaterial() or addShaderMaterial() const c8* vertex_program_ptr = 0; const c8* pixel_program_ptr = 0; -- cgit v1.2.3