diff --git a/res/layouts/pages/settings_graphics.xml.lua b/res/layouts/pages/settings_graphics.xml.lua index c4503e52..32c26fd5 100644 --- a/res/layouts/pages/settings_graphics.xml.lua +++ b/res/layouts/pages/settings_graphics.xml.lua @@ -42,4 +42,6 @@ function on_open() create_setting("graphics.gamma", "Gamma", 0.05, "", "graphics.gamma.tooltip") 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_setting("graphics.shadows-quality", "Shadows quality", 1) end diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index 1836981d..d2d7c63e 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -98,6 +98,8 @@ settings.V-Sync=Вертикальная Синхронизация settings.Key=Кнопка settings.Controls Search Mode=Поиск по привязанной кнопки управления settings.Limit Background FPS=Ограничить фоновую частоту кадров +settings.Advanced render=Продвинутый рендер +settings.Shadows quality=Качество теней # Управление chunks.reload=Перезагрузить Чанки diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 8c88931b..284ebb43 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -189,8 +189,7 @@ void ChunksRenderer::drawChunksShadowsPass( atlas.getTexture()->bind(); - for (int i = indices.size()-1; i >= 0; i--) { - auto& chunk = chunks.getChunks()[indices[i].index]; + for (const auto& chunk : chunks.getChunks()) { if (chunk == nullptr) { continue; } @@ -216,7 +215,6 @@ void ChunksRenderer::drawChunks( const auto& atlas = assets.require("blocks"); atlas.getTexture()->bind(); - update(); // [warning] this whole method is not thread-safe for chunks diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index f6eded82..1fec6a47 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -345,7 +345,7 @@ void WorldRenderer::generateShadowsMap(const Camera& camera, const DrawContext& const auto& settings = engine.getSettings(); int resolution = shadowMap->getResolution(); - float shadowMapScale = 0.05f; + float shadowMapScale = 0.2f / (1 << glm::max(0L, settings.graphics.shadowsQuality.get())); float shadowMapSize = resolution * shadowMapScale; shadowCamera = Camera(camera.position, shadowMapSize); shadowCamera.near = 0.1f; @@ -393,6 +393,20 @@ void WorldRenderer::draw( camera.setAspectRatio(vp.x / static_cast(vp.y)); const auto& settings = engine.getSettings(); + gbufferPipeline = settings.graphics.advancedRender.get(); + int shadowsQuality = settings.graphics.shadowsQuality.get(); + int resolution = 1024 << shadowsQuality; + if (shadowsQuality > 0 && !shadows) { + shadowMap = std::make_unique(resolution); + shadows = true; + } else if (shadowsQuality == 0) { + shadowMap.reset(); + shadows = false; + } + if (shadows && shadowMap->getResolution() != resolution) { + shadowMap = std::make_unique(resolution); + } + const auto& worldInfo = world->getInfo(); float sqrtT = glm::sqrt(weather.t); @@ -403,10 +417,9 @@ void WorldRenderer::draw( skybox->refresh(pctx, worldInfo.daytime, mie, 4); + chunks->update(); + if (shadows) { - if (shadowMap == nullptr) { - shadowMap = std::make_unique(1024 * 8); - } generateShadowsMap(camera, pctx); } diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index 39df07f0..a968d9e0 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -74,6 +74,8 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.add("chunk-max-vertices", &settings.graphics.chunkMaxVertices); 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("shadows-quality", &settings.graphics.shadowsQuality); builder.section("ui"); builder.add("language", &settings.ui.language); diff --git a/src/settings.hpp b/src/settings.hpp index 53ebf5f9..714372fe 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -75,6 +75,10 @@ struct GraphicsSettings { IntegerSetting chunkMaxVerticesDense {800'000, 0, 8'000'000}; /// @brief Limit of chunk renderers count IntegerSetting chunkMaxRenderers {6, -4, 32}; + /// @brief Advanced render pipeline + FlagSetting advancedRender {true}; + /// @brief Shadows quality + IntegerSetting shadowsQuality {0, 0, 2}; }; struct DebugSettings {