Proper fog disabling with and without shaders (#227)
parent
e239d8a6d3
commit
9627563107
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
57
src/game.cpp
57
src/game.cpp
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue