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

@ -722,8 +722,19 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
tonemap.texture_size = Vector2i(color_size.x, color_size.y);
if (p_render_data->environment.is_valid()) {
// When we are using RGB10A2 render buffer format, our scene
// is limited to a maximum of 2.0. In this case we should limit
// the max white of tonemappers, specifically AgX which defaults
// to a high white value.
bool limit_agx_white = rb->get_base_data_format() == RD::DATA_FORMAT_A2B10G10R10_UNORM_PACK32;
tonemap.tonemap_mode = environment_get_tone_mapper(p_render_data->environment);
tonemap.white = environment_get_white(p_render_data->environment);
RendererEnvironmentStorage::TonemapParameters params = environment_get_tonemap_parameters(p_render_data->environment, limit_agx_white);
tonemap.tonemapper_params[0] = params.tonemapper_params[0];
tonemap.tonemapper_params[1] = params.tonemapper_params[1];
tonemap.tonemapper_params[2] = params.tonemapper_params[2];
tonemap.tonemapper_params[3] = params.tonemapper_params[3];
tonemap.white = environment_get_white(p_render_data->environment, limit_agx_white);
tonemap.exposure = environment_get_exposure(p_render_data->environment);
}
@ -882,9 +893,20 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
RendererRD::ToneMapper::TonemapSettings tonemap;
if (p_render_data->environment.is_valid()) {
// When we are using RGB10A2 render buffer format, our scene
// is limited to a maximum of 2.0. In this case we should limit
// the max white of tonemappers, specifically AgX which defaults
// to a high white value.
bool limit_agx_white = rb->get_base_data_format() == RD::DATA_FORMAT_A2B10G10R10_UNORM_PACK32;
tonemap.tonemap_mode = environment_get_tone_mapper(p_render_data->environment);
RendererEnvironmentStorage::TonemapParameters params = environment_get_tonemap_parameters(p_render_data->environment, limit_agx_white);
tonemap.tonemapper_params[0] = params.tonemapper_params[0];
tonemap.tonemapper_params[1] = params.tonemapper_params[1];
tonemap.tonemapper_params[2] = params.tonemapper_params[2];
tonemap.tonemapper_params[3] = params.tonemapper_params[3];
tonemap.exposure = environment_get_exposure(p_render_data->environment);
tonemap.white = environment_get_white(p_render_data->environment);
tonemap.white = environment_get_white(p_render_data->environment, limit_agx_white);
}
// We don't support glow or auto exposure here, if they are needed, don't use subpasses!