Proper fog disabling with and without shaders (#227)

This commit is contained in:
Vitaliy 2022-01-05 23:22:38 +03:00 committed by GitHub
parent e239d8a6d3
commit 9627563107
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 41 deletions

View File

@ -3,6 +3,7 @@ uniform sampler2D normalTexture;
uniform sampler2D textureFlags; uniform sampler2D textureFlags;
uniform vec4 skyBgColor; uniform vec4 skyBgColor;
uniform mediump float fogDistance;
uniform vec3 eyePosition; uniform vec3 eyePosition;
varying mediump vec4 varColor; varying mediump vec4 varColor;
@ -73,9 +74,11 @@ void main(void)
// As additions usually come for free following a multiplication, the new formula // As additions usually come for free following a multiplication, the new formula
// should be more efficient as well. // should be more efficient as well.
// Note: clarity = (1 - fogginess) // Note: clarity = (1 - fogginess)
if (fogDistance > 0.0) { // -1.0 means disabled
float clarity = clamp(fogShadingParameter float clarity = clamp(fogShadingParameter
- fogShadingParameter * length(eyeVec), 0.0, 1.0); - fogShadingParameter * length(eyeVec), 0.0, 1.0);
col = mix(skyBgColor, col, clarity); col = mix(skyBgColor, col, clarity);
}
col = vec4(col.rgb, base.a); col = vec4(col.rgb, base.a);
gl_FragColor = col; gl_FragColor = col;

View File

@ -1,7 +1,7 @@
// Color of the light emitted by the sun. // Color of the light emitted by the sun.
uniform highp mat4 mWorld; uniform highp mat4 mWorld;
uniform vec3 dayLight; uniform vec3 dayLight;
uniform float fogDistance; uniform mediump float fogDistance;
uniform float animationTimer; uniform float animationTimer;
varying mediump vec4 varColor; varying mediump vec4 varColor;

View File

@ -40,9 +40,11 @@ void main(void)
// As additions usually come for free following a multiplication, the new formula // As additions usually come for free following a multiplication, the new formula
// should be more efficient as well. // should be more efficient as well.
// Note: clarity = (1 - fogginess) // Note: clarity = (1 - fogginess)
if (fogDistance > 0.0) { // -1.0 means disabled
float clarity = clamp(fogShadingParameter float clarity = clamp(fogShadingParameter
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
col = mix(skyBgColor, col, clarity); col = mix(skyBgColor, col, clarity);
}
gl_FragColor = vec4(col.rgb, base.a); gl_FragColor = vec4(col.rgb, base.a);
} }

View File

@ -60,7 +60,7 @@ void draw_anaglyph_3d_mode(Camera& camera, bool show_hud, Hud& hud,
//clear the depth buffer, and color //clear the depth buffer, and color
driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255)); driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255));
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED; driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED;
driver->getOverrideMaterial().EnableFlags = irr::video::EMF_COLOR_MASK; driver->getOverrideMaterial().EnableFlags |= irr::video::EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT + irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW; + irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;
@ -88,7 +88,7 @@ void draw_anaglyph_3d_mode(Camera& camera, bool show_hud, Hud& hud,
driver->clearZBuffer(); driver->clearZBuffer();
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN
+ irr::video::ECP_BLUE; + irr::video::ECP_BLUE;
driver->getOverrideMaterial().EnableFlags = irr::video::EMF_COLOR_MASK; driver->getOverrideMaterial().EnableFlags |= irr::video::EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT + irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW; + irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;

View File

@ -698,7 +698,7 @@ public:
m_sky_bg_color.set(bgcolorfa, services); m_sky_bg_color.set(bgcolorfa, services);
// Fog distance // Fog distance
float fog_distance = 10000 * BS; float fog_distance = -1.0f; // sentinel for disabled fog
if (m_fog_enabled && !*m_force_fog_off) if (m_fog_enabled && !*m_force_fog_off)
fog_distance = *m_fog_range; fog_distance = *m_fog_range;
@ -1164,6 +1164,7 @@ struct GameRunData {
bool left_punch; bool left_punch;
bool update_wielded_item_trigger; bool update_wielded_item_trigger;
bool reset_jump_timer; bool reset_jump_timer;
bool disable_fog;
float nodig_delay_timer; float nodig_delay_timer;
float noplace_delay_timer; float noplace_delay_timer;
float dig_time; float dig_time;
@ -1961,7 +1962,7 @@ bool Game::createClient(const std::string &playername,
#endif #endif
GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory( GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory(
&flags.force_fog_off, &runData.fog_range, client); &runData.disable_fog, &runData.fog_range, client);
shader_src->addShaderConstantSetterFactory(scsf); shader_src->addShaderConstantSetterFactory(scsf);
// Update cached textures, meshes and materials // Update cached textures, meshes and materials
@ -4188,15 +4189,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
Fog range Fog range
*/ */
if (draw_control->range_all) { runData.disable_fog = !m_cache_enable_fog || flags.force_fog_off || draw_control->range_all;
#if defined(__ANDROID__) || defined(__IOS__)
runData.fog_range = draw_control->wanted_range * 4 * BS;
#else
runData.fog_range = 100000 * BS;
#endif
} else {
runData.fog_range = draw_control->wanted_range * BS; runData.fog_range = draw_control->wanted_range * BS;
}
/* /*
Calculate general brightness Calculate general brightness
@ -4267,7 +4261,6 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
Fog Fog
*/ */
if (m_cache_enable_fog && !flags.force_fog_off) {
driver->setFog( driver->setFog(
sky->getBgColor(), sky->getBgColor(),
video::EFT_FOG_LINEAR, video::EFT_FOG_LINEAR,
@ -4277,17 +4270,6 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
false, // pixel fog false, // pixel fog
true // range fog true // range fog
); );
} else {
driver->setFog(
sky->getBgColor(),
video::EFT_FOG_LINEAR,
100000 * BS,
110000 * BS,
0.01,
false, // pixel fog
false // range fog
);
}
/* /*
Get chat messages from client Get chat messages from client
@ -4378,10 +4360,21 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
TimeTaker tt_draw("mainloop: draw"); TimeTaker tt_draw("mainloop: draw");
driver->beginScene(true, true, skycolor); driver->beginScene(true, true, skycolor);
if (runData.disable_fog) {
driver->getOverrideMaterial().reset();
driver->getOverrideMaterial().EnableFlags = video::EMF_FOG_ENABLE;
driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX
| irr::scene::ESNRP_SOLID | irr::scene::ESNRP_TRANSPARENT
| irr::scene::ESNRP_TRANSPARENT_EFFECT | irr::scene::ESNRP_SHADOW;
}
draw_scene(driver, smgr, *camera, *client, player, *hud, mapper, draw_scene(driver, smgr, *camera, *client, player, *hud, mapper,
guienv, screensize, skycolor, flags.show_hud, guienv, screensize, skycolor, flags.show_hud,
flags.show_minimap); flags.show_minimap);
driver->getOverrideMaterial().EnableFlags = 0;
driver->getOverrideMaterial().EnablePasses = 0;
/* /*
Profiler graph Profiler graph
*/ */