add 'grahics.advanced-render' and 'graphics.shadows-quality' settings

This commit is contained in:
MihailRis 2025-05-11 01:09:41 +03:00
parent b5253bff99
commit b272d86619
6 changed files with 28 additions and 7 deletions

View File

@ -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

View File

@ -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=Перезагрузить Чанки

View File

@ -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<Atlas>("blocks");
atlas.getTexture()->bind();
update();
// [warning] this whole method is not thread-safe for chunks

View File

@ -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<float>(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<ShadowMap>(resolution);
shadows = true;
} else if (shadowsQuality == 0) {
shadowMap.reset();
shadows = false;
}
if (shadows && shadowMap->getResolution() != resolution) {
shadowMap = std::make_unique<ShadowMap>(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<ShadowMap>(1024 * 8);
}
generateShadowsMap(camera, pctx);
}

View File

@ -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);

View File

@ -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 {