From ed276419213e4b03b3405cc67a648cbace911eb0 Mon Sep 17 00:00:00 2001 From: Musa Haji Date: Wed, 5 Feb 2025 22:36:35 -0500 Subject: [PATCH] feat(elitedangerous): add `UpgradeToneMapPerceptual()` --- src/games/elitedangerous/addon.cpp | 2 +- src/games/elitedangerous/common.hlsl | 35 +++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/games/elitedangerous/addon.cpp b/src/games/elitedangerous/addon.cpp index 6cbae9e0..ddba749b 100644 --- a/src/games/elitedangerous/addon.cpp +++ b/src/games/elitedangerous/addon.cpp @@ -192,7 +192,7 @@ renodx::utils::settings::Settings settings = { .label = "Grading Application", .section = "Color Grading", .tooltip = "Chooses method to apply grading for HDR.", - .labels = {"Luminance", "Per Channel"}, + .labels = {"Luminance", "Per Channel", "Perceptual"}, .is_enabled = []() { return RENODX_TONE_MAP_TYPE != 0; }, }, new renodx::utils::settings::Setting{ diff --git a/src/games/elitedangerous/common.hlsl b/src/games/elitedangerous/common.hlsl index 3d9da8a6..96160cff 100644 --- a/src/games/elitedangerous/common.hlsl +++ b/src/games/elitedangerous/common.hlsl @@ -96,11 +96,44 @@ float3 UpgradeToneMapByLuminance(float3 color_hdr, float3 color_sdr, float3 post return lerp(color_hdr, color_scaled, post_process_strength); } +float3 UpgradeToneMapPerceptual(float3 untonemapped, float3 tonemapped, float3 post_processed, float strength) { + float3 lab_untonemapped = renodx::color::ictcp::from::BT709(untonemapped); + float3 lab_tonemapped = renodx::color::ictcp::from::BT709(tonemapped); + float3 lab_post_processed = renodx::color::ictcp::from::BT709(post_processed); + + float3 lch_untonemapped = renodx::color::oklch::from::OkLab(lab_untonemapped); + float3 lch_tonemapped = renodx::color::oklch::from::OkLab(lab_tonemapped); + float3 lch_post_processed = renodx::color::oklch::from::OkLab(lab_post_processed); + + float3 lch_upgraded = lch_untonemapped; + lch_upgraded.xz *= renodx::math::DivideSafe(lch_post_processed.xz, lch_tonemapped.xz, 0.f); + + float3 lab_upgraded = renodx::color::oklab::from::OkLCh(lch_upgraded); + + float c_untonemapped = length(lab_untonemapped.yz); + float c_tonemapped = length(lab_tonemapped.yz); + float c_post_processed = length(lab_post_processed.yz); + + if (c_untonemapped > 0) { + float new_chrominance = c_untonemapped; + new_chrominance = min(max(c_untonemapped, 0.25f), c_untonemapped * (c_post_processed / c_tonemapped)); + if (new_chrominance > 0) { + lab_upgraded.yz *= new_chrominance / c_untonemapped; + } + } + + float3 upgraded = renodx::color::bt709::from::ICtCp(lab_upgraded); + return lerp(untonemapped, upgraded, strength); +} + float3 UpgradeToneMap(float3 color_hdr, float3 color_sdr, float3 post_process_color, float post_process_strength) { if (RENODX_TONE_MAP_RESTORATION_METHOD == 1.f) { return UpgradeToneMapPerChannel(color_hdr, color_sdr, post_process_color, post_process_strength); + } else if (RENODX_TONE_MAP_RESTORATION_METHOD == 2.f) { + return UpgradeToneMapPerceptual(color_hdr, color_sdr, post_process_color, post_process_strength); + } else { + return UpgradeToneMapByLuminance(color_hdr, color_sdr, post_process_color, post_process_strength); } - return UpgradeToneMapByLuminance(color_hdr, color_sdr, post_process_color, post_process_strength); } float3 DisplayMapAndScale(float3 color) {