Skip to content

Commit ab63e4b

Browse files
committed
Update Settings and Perceptual AE
1 parent d6d8f09 commit ab63e4b

File tree

7 files changed

+394
-567
lines changed

7 files changed

+394
-567
lines changed

src/games/crimsondesert/addon.cpp

Lines changed: 223 additions & 217 deletions
Large diffs are not rendered by default.

src/games/crimsondesert/common.hlsl

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "./psycho_test17_custom.hlsl"
44
#include "./shared.h"
55

6-
76
float NR(float x, float sigma, float n) {
87
float ax = abs(x);
98
float xn = pow(max(ax, 0.0f), n);
@@ -221,34 +220,39 @@ float3 CustomPsychoV17Peak(
221220
float peak_value,
222221
float mid_gray_scale = 1.f,
223222
int gamut_compression_mode = 1) {
224-
bool valid_current_average = (current_average > 0.0f) && !isnan(current_average) && !isinf(current_average);
225-
bool valid_target_average = (target_average > 0.0f) && !isnan(target_average) && !isinf(target_average);
226-
227-
if (!valid_target_average) {
228-
return 0.0f.xxx;
223+
if (!(target_average > 0.0f)) {
224+
return 0.0f;
229225
}
230226

231-
if (!valid_current_average) {
227+
if (!(current_average > 0.0f)) {
232228
current_average = target_average;
233229
}
234230

235231
float3 bt709_scene = untonemapped_bt709 * RENODX_TONE_MAP_EXPOSURE;
236-
bool has_valid_anchor = valid_current_average && valid_target_average;
237-
float boosted = has_valid_anchor ? (target_average / current_average) : 1.0f;
238-
if (has_valid_anchor) {
239-
bt709_scene *= boosted;
232+
233+
if (target_average >= peak_value) {
234+
return min(bt709_scene, peak_value);
240235
}
241236

237+
float boost = 1.f;
238+
if (!(current_average > 0.0f)) {
239+
current_average = target_average;
240+
} else {
241+
boost = renodx::math::DivideSafe(target_average, current_average, 1.0f);
242+
}
243+
244+
bt709_scene *= boost;
245+
242246
float3 lms_in = renodx::color::lms::from::BT709(bt709_scene);
243247
float yf_input = renodx::color::yf::from::LMS(lms_in);
244248
float yf_midgray = renodx::color::yf::from::BT709(0.18f);
245249
float yf_target = yf_input;
246250

247251
if (RENODX_TONE_MAP_HIGHLIGHTS != 1.f) {
248-
yf_target = renodx::color::grade::Highlights(yf_target, RENODX_TONE_MAP_HIGHLIGHTS, yf_midgray, 1.f);
252+
yf_target = renodx::color::grade::Highlights(yf_target, RENODX_TONE_MAP_HIGHLIGHTS, yf_midgray);
249253
}
250254
if (RENODX_TONE_MAP_SHADOWS != 1.f) {
251-
yf_target = renodx::color::grade::Shadows(yf_target, RENODX_TONE_MAP_SHADOWS, yf_midgray, 1.f);
255+
yf_target = renodx::color::grade::Shadows(yf_target, RENODX_TONE_MAP_SHADOWS, yf_midgray);
252256
}
253257
if (RENODX_TONE_MAP_CONTRAST != 1.f) {
254258
yf_target = renodx::color::grade::ContrastSafe(yf_target, RENODX_TONE_MAP_CONTRAST, yf_midgray);
@@ -257,15 +261,10 @@ float3 CustomPsychoV17Peak(
257261

258262
float yf_scale = renodx::math::DivideSafe(yf_target, yf_input, 1.f);
259263
bt709_scene *= yf_scale;
260-
if (has_valid_anchor) {
261-
bt709_scene /= boosted;
262-
}
263264

264-
if (target_average >= peak_value) {
265-
return min(bt709_scene, peak_value.xxx);
266-
}
265+
bt709_scene /= boost;
267266

268-
float anchor_in = has_valid_anchor ? current_average : target_average;
267+
float anchor_in = current_average;
269268
float anchor_out = target_average;
270269

271270
return renodx::tonemap::psycho::psychotm_test17(
@@ -288,7 +287,7 @@ float3 CustomPsychoV17Peak(
288287
gamut_compression_mode);
289288
}
290289

291-
float3 CustomPsychoV17AutoExposure(float3 untonemapped_bt709, float peak, float mid_gray_scale,float current_average, float target_average, bool is_sdr = false) {
290+
float3 CustomPsychoV17AutoExposure(float3 untonemapped_bt709, float peak, float mid_gray_scale, float current_average, float target_average, bool is_sdr = false) {
292291
return CustomPsychoV17Peak(
293292
untonemapped_bt709,
294293
current_average,
@@ -299,24 +298,19 @@ float3 CustomPsychoV17AutoExposure(float3 untonemapped_bt709, float peak, float
299298
}
300299

301300
float3 ProcessTonemap(float3 untonemapped_bt709, float calculated_peak, float mid_gray_scale, float current_average, float target_average, bool is_sdr = false) {
302-
const float white_clip = 100.f;
303-
const int white_curve_mode = 1;
301+
if (RENODX_TONE_MAP_TYPE == 0.f) {
302+
return untonemapped_bt709;
303+
}
304304

305305
mid_gray_scale = lerp(1.f, mid_gray_scale, CUSTOM_TONE_MAP_MIDGRAY_ADJUST);
306306

307-
float3 output_color = untonemapped_bt709;
308-
if (RENODX_TONE_MAP_TYPE == 1.f) {
309-
310-
output_color = CustomPsychoV17AutoExposure(
311-
output_color,
312-
calculated_peak,
313-
mid_gray_scale,
314-
current_average,
315-
target_average,
316-
is_sdr);
317-
318-
}
319-
return output_color;
307+
return CustomPsychoV17AutoExposure(
308+
untonemapped_bt709,
309+
calculated_peak,
310+
mid_gray_scale,
311+
current_average,
312+
target_average,
313+
is_sdr);
320314
}
321315

322316
float3 CustomTonemap(float3 untonemapped_bt709, float mid_gray_scale = 1.f, float current_average = 0.18f, float target_average = 0.18f) {
@@ -335,7 +329,7 @@ float3 CustomTonemap(float3 untonemapped_bt709, float mid_gray_scale = 1.f, floa
335329
return output_color;
336330
}
337331

338-
float3 CustomTonemapSDR(float3 untonemapped_bt709, float mid_gray_scale, float current_average, float target_average) {
332+
float3 CustomTonemapSDR(float3 untonemapped_bt709, float mid_gray_scale, float current_average = 0.18f, float target_average = 0.18f) {
339333
float calculated_peak = 1.f;
340334
calculated_peak = CUSTOM_SDR_BLACK_CRUSH_FIX == 1 ? renodx::color::correct::GammaSafe(calculated_peak) : calculated_peak;
341335

src/games/crimsondesert/grading/tonemap.hlsli

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ cbuffer __3__35__0__0__ExposureConstantBuffer : register(b31, space35) {
99
// AE2 fields used by the grading path:
1010
// _exposure0.x = final adapted exposure scalar written by AdaptExposure
1111
// _exposure2.x = raw meter / histogram luminance
12-
// _exposure2.y = fast equivalent-background carryover
12+
// _exposure2.y = signed fast-direction settling delta from the clean field
1313
// _exposure2.z = clean adapted field ("Adapt" in the debug panel)
14-
// _exposure2.w = slow equivalent-background carryover
14+
// _exposure2.w = signed slow-direction settling delta from the clean field
1515
// _exposure4.z = filtered exposure history used by glare/lens effects
1616

1717
cbuffer __3__1__0__0__GlobalPushConstants : register(b0, space1) {
@@ -32,39 +32,20 @@ cbuffer __3__1__0__0__GlobalPushConstants : register(b0, space1) {
3232
// _userImageAdjust.z is the grading exposure multiplier
3333
// ("ColorGradeExposure" in the addon UI). It sits on top of the AE solve.
3434

35-
bool IsFinitePositiveYf(float value) {
36-
return (value > 0.0f) && !isnan(value) && !isinf(value);
37-
}
38-
39-
float SanitizePerceptualYf(float value) {
40-
return clamp(value, 9.999999974752427e-07f, 65536.0f);
41-
}
4235

4336
float GetPerceptualAdaptedFieldYf() {
4437
// Prefer the clean adapted field, then fall back to the raw meter when
4538
// history is invalid (first frame / load / reset).
46-
float field_state = IsFinitePositiveYf(_exposure2.z) ? SanitizePerceptualYf(_exposure2.z) :
47-
(IsFinitePositiveYf(_exposure2.x) ? SanitizePerceptualYf(_exposure2.x) : 0.18f);
39+
float field_state = _exposure2.z;
4840

49-
// Carryover terms preserve short/long dark adaptation memory after bright
50-
// scenes and are added back to the clean field to form the current anchor.
41+
// AE2 exposes the live adaptation anchor as the clean field plus signed
42+
// settling deltas. Negative FastBg means the observer is still catching up
43+
// to a brighter field; positive SlowBg means the observer is still carrying
44+
// a brighter past state into a darker field.
5145
float fast_equivalent_background = _exposure2.y;
5246
float slow_equivalent_background = _exposure2.w;
53-
bool fast_valid = IsFinitePositiveYf(fast_equivalent_background);
54-
bool slow_valid = IsFinitePositiveYf(slow_equivalent_background);
55-
56-
if (fast_valid) {
57-
fast_equivalent_background = SanitizePerceptualYf(fast_equivalent_background);
58-
} else {
59-
fast_equivalent_background = 0.0f;
60-
}
61-
if (slow_valid) {
62-
slow_equivalent_background = SanitizePerceptualYf(slow_equivalent_background);
63-
} else {
64-
slow_equivalent_background = 0.0f;
65-
}
6647

67-
return SanitizePerceptualYf(field_state + fast_equivalent_background + slow_equivalent_background);
48+
return field_state + fast_equivalent_background + slow_equivalent_background;
6849
}
6950

7051
// // Core SDR curve stage only. Expects per-channel linear inputs and outputs in the same space.

0 commit comments

Comments
 (0)