Proper fog disabling with and without shaders (#227)

master
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 vec4 skyBgColor;
uniform mediump float fogDistance;
uniform vec3 eyePosition;
varying mediump vec4 varColor;
@ -73,9 +74,11 @@ void main(void)
// 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), 0.0, 1.0);
col = mix(skyBgColor, col, clarity);
if (fogDistance > 0.0) { // -1.0 means disabled
float clarity = clamp(fogShadingParameter
- fogShadingParameter * length(eyeVec), 0.0, 1.0);
col = mix(skyBgColor, col, clarity);
}
col = vec4(col.rgb, base.a);
gl_FragColor = col;

View File

@ -1,7 +1,7 @@
// Color of the light emitted by the sun.
uniform highp mat4 mWorld;
uniform vec3 dayLight;
uniform float fogDistance;
uniform mediump float fogDistance;
uniform float animationTimer;
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
// 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);
if (fogDistance > 0.0) { // -1.0 means disabled
float clarity = clamp(fogShadingParameter
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
col = mix(skyBgColor, col, clarity);
}
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
driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255));
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
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
+ 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->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN
+ 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
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;

View File

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