add 'graphics.ssao' setting

This commit is contained in:
MihailRis 2025-07-12 21:36:27 +03:00
parent 5ec9f14021
commit b04dbd5809
6 changed files with 28 additions and 8 deletions

View File

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

View File

@ -2,23 +2,30 @@
#include <fog>
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);
}

View File

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

View File

@ -38,6 +38,7 @@ struct EngineSettings;
struct CompileTimeShaderSettings {
bool advancedRender = false;
bool shadows = false;
bool ssao = false;
};
class WorldRenderer {

View File

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

View File

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