Add agx_white, agx_contrast and HDR support to the AgX tonemapper.

Also optimize all tonemappers to perform less calculations per-pixel.

Note: unlike `white`, `agx_white` is limited to a minimum of `2.0` and defaults to `16.29`. When using a RGB10A2 render buffer, `agx_white` will be ignored and a value of `2.0` will be used instead to ensure good behavior on the Mobile renderer.
This commit is contained in:
Allen Pestaluky
2025-05-29 12:19:00 -04:00
parent 7a228b4b91
commit 628df323e2
24 changed files with 546 additions and 241 deletions

View File

@@ -147,6 +147,10 @@ void ToneMapper::tonemapper(RID p_source_color, RID p_dst_framebuffer, const Ton
}
tonemap.push_constant.tonemapper = p_settings.tonemap_mode;
tonemap.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];
tonemap.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];
tonemap.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];
tonemap.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];
tonemap.push_constant.flags |= p_settings.use_auto_exposure ? TONEMAP_FLAG_USE_AUTO_EXPOSURE : 0;
tonemap.push_constant.exposure = p_settings.exposure;
tonemap.push_constant.white = p_settings.white;
@@ -237,6 +241,11 @@ void ToneMapper::tonemapper_mobile(RID p_source_color, RID p_dst_framebuffer, co
tonemap_mobile.push_constant.white = p_settings.white;
tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;
tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];
tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];
tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];
tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];
uint32_t spec_constant = 0;
spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;
spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;
@@ -324,6 +333,11 @@ void ToneMapper::tonemapper_subpass(RD::DrawListID p_subpass_draw_list, RID p_so
tonemap_mobile.push_constant.white = p_settings.white;
tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;
tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];
tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];
tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];
tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];
uint32_t spec_constant = TONEMAP_MOBILE_ADRENO_BUG;
spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;
//spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;

View File

@@ -122,6 +122,8 @@ private:
float white; // 4 - 88
float auto_exposure_scale; // 4 - 92
float luminance_multiplier; // 4 - 96
float tonemapper_params[4]; // 16 - 112
};
struct TonemapPushConstantMobile {
@@ -135,6 +137,8 @@ private:
float glow_map_strength; // 4 - 40
float exposure; // 4 - 44
float white; // 4 - 48
float tonemapper_params[4]; // 16 - 64
};
/* tonemap actually writes to a framebuffer, which is
@@ -171,6 +175,7 @@ public:
RID glow_map;
RS::EnvironmentToneMapper tonemap_mode = RS::ENV_TONE_MAPPER_LINEAR;
float tonemapper_params[4] = { 0.0, 0.0, 0.0, 0.0 };
float exposure = 1.0;
float white = 1.0;