diff --git a/res/layouts/pages/settings_graphics.xml.lua b/res/layouts/pages/settings_graphics.xml.lua index 32c26fd5..99ba6609 100644 --- a/res/layouts/pages/settings_graphics.xml.lua +++ b/res/layouts/pages/settings_graphics.xml.lua @@ -43,5 +43,6 @@ function on_open() create_checkbox("graphics.backlight", "Backlight", "graphics.backlight.tooltip") create_checkbox("graphics.dense-render", "Dense blocks render", "graphics.dense-render.tooltip") create_checkbox("graphics.advanced-render", "Advanced render", "graphics.advanced-render.tooltip") + create_checkbox("graphics.ssao", "SSAO", "graphics.ssao.tooltip") create_setting("graphics.shadows-quality", "Shadows quality", 1) end diff --git a/res/shaders/effects/deferred_lighting.glsl b/res/shaders/effects/deferred_lighting.glsl index 5df6b148..27488911 100644 --- a/res/shaders/effects/deferred_lighting.glsl +++ b/res/shaders/effects/deferred_lighting.glsl @@ -2,23 +2,30 @@ #include vec4 effect() { - float ssao = 0.0; vec4 pos = texture(u_position, v_uv); + float light = 1.0; + +#ifdef ENABLE_SSAO + light = 0.0; float z = pos.z; for (int y = -2; y <= 2; y++) { for (int x = -2; x <= 2; x++) { vec2 offset = vec2(x, y) / u_screenSize; - ssao += texture(u_ssao, v_uv + offset * 2.0).r; + light += texture(u_ssao, v_uv + offset * 2.0).r; } } - ssao /= 24.0; + light /= 24.0; +#endif // ENABLE_SSAO + vec4 modelpos = u_inverseView * pos; vec3 normal = transpose(mat3(u_view)) * texture(u_normal, v_uv).xyz; vec3 dir = modelpos.xyz - u_cameraPos; + #ifdef ENABLE_SHADOWS - ssao *= max(calc_shadow(modelpos, normal, length(pos)), texture(u_emission, v_uv).r); + light *= max(calc_shadow(modelpos, normal, length(pos)), texture(u_emission, v_uv).r); #endif + vec3 fogColor = texture(u_skybox, dir).rgb; float fog = calc_fog(length(u_view * vec4((modelpos.xyz - u_cameraPos) * FOG_POS_SCALE, 0.0)) / 256.0); - return vec4(mix(texture(u_screen, v_uv).rgb * mix(1.0, ssao, 1.0), fogColor, fog), 1.0); + return vec4(mix(texture(u_screen, v_uv).rgb * mix(1.0, light, 1.0), fogColor, fog), 1.0); } diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 5a1fe21a..7d7bc79f 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -445,11 +445,13 @@ void WorldRenderer::draw( } CompileTimeShaderSettings currentSettings { - gbufferPipeline, shadows - }; + gbufferPipeline, + shadows, + settings.graphics.ssao.get() && gbufferPipeline}; if ( prevCTShaderSettings.advancedRender != currentSettings.advancedRender || - prevCTShaderSettings.shadows != currentSettings.shadows + prevCTShaderSettings.shadows != currentSettings.shadows || + prevCTShaderSettings.ssao != currentSettings.ssao ) { if (shadows) { Shader::preprocessor->define("ENABLE_SHADOWS", "true"); @@ -457,6 +459,12 @@ void WorldRenderer::draw( Shader::preprocessor->undefine("ENABLE_SHADOWS"); } + if (currentSettings.ssao) { + Shader::preprocessor->define("ENABLE_SSAO", "true"); + } else { + Shader::preprocessor->undefine("ENABLE_SSAO"); + } + if (gbufferPipeline) { Shader::preprocessor->define("ADVANCED_RENDER", "true"); } else { diff --git a/src/graphics/render/WorldRenderer.hpp b/src/graphics/render/WorldRenderer.hpp index ec159012..5d33f8cd 100644 --- a/src/graphics/render/WorldRenderer.hpp +++ b/src/graphics/render/WorldRenderer.hpp @@ -38,6 +38,7 @@ struct EngineSettings; struct CompileTimeShaderSettings { bool advancedRender = false; bool shadows = false; + bool ssao = false; }; class WorldRenderer { diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index a968d9e0..000e965b 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -75,6 +75,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.add("chunk-max-vertices-dense", &settings.graphics.chunkMaxVerticesDense); builder.add("chunk-max-renderers", &settings.graphics.chunkMaxRenderers); builder.add("advanced-render", &settings.graphics.advancedRender); + builder.add("ssao", &settings.graphics.ssao); builder.add("shadows-quality", &settings.graphics.shadowsQuality); builder.section("ui"); diff --git a/src/settings.hpp b/src/settings.hpp index 699d2b28..e8826800 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -77,6 +77,8 @@ struct GraphicsSettings { IntegerSetting chunkMaxRenderers {6, -4, 32}; /// @brief Advanced render pipeline FlagSetting advancedRender {true}; + /// @brief Screen space ambient occlusion + FlagSetting ssao {true}; /// @brief Shadows quality IntegerSetting shadowsQuality {0, 0, 3}; };