Skip to content

Commit 7db4452

Browse files
Added PBR Neutral tone mapping mode (#247)
1 parent be96bb8 commit 7db4452

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

Components/src/ToneMapping.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ bool ToneMappingUpdateUI(HLSL::ToneMappingAttribs& Attribs, float* AverageLogLum
8686
{
8787
bool AttribsChanged = false;
8888
{
89-
std::array<const char*, 10> ToneMappingMode{};
89+
std::array<const char*, 11> ToneMappingMode{};
9090
ToneMappingMode[TONE_MAPPING_MODE_NONE] = "None";
9191
ToneMappingMode[TONE_MAPPING_MODE_EXP] = "Exp";
9292
ToneMappingMode[TONE_MAPPING_MODE_REINHARD] = "Reinhard";
@@ -97,6 +97,7 @@ bool ToneMappingUpdateUI(HLSL::ToneMappingAttribs& Attribs, float* AverageLogLum
9797
ToneMappingMode[TONE_MAPPING_MODE_ADAPTIVE_LOG] = "Adaptive log";
9898
ToneMappingMode[TONE_MAPPING_MODE_AGX] = "AgX";
9999
ToneMappingMode[TONE_MAPPING_MODE_AGX_CUSTOM] = "AgX Custom";
100+
ToneMappingMode[TONE_MAPPING_MODE_PBR_NEUTRAL] = "PBR Neutral";
100101
if (ImGui::Combo("Tone Mapping Mode", &Attribs.iToneMappingMode, ToneMappingMode.data(), static_cast<int>(ToneMappingMode.size())))
101102
AttribsChanged = true;
102103
}

Shaders/PostProcess/ToneMapping/public/ToneMapping.fxh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,29 @@ float3 ToneMap(in float3 f3Color, ToneMappingAttribs Attribs, float fAveLogLum)
170170
f3ToneMappedColor = AgXEotf(f3ToneMappedColor);
171171
return f3ToneMappedColor;
172172
}
173+
#elif TONE_MAPPING_MODE == TONE_MAPPING_MODE_PBR_NEUTRAL
174+
{
175+
// https://www.khronos.org/news/press/khronos-pbr-neutral-tone-mapper-released-for-true-to-life-color-rendering-of-3d-products
176+
// https://github.com/KhronosGroup/ToneMapping/blob/main/PBR_Neutral/pbrNeutral.glsl
177+
float StartCompression = 0.8 - 0.04;
178+
float Desaturation = 0.15;
179+
180+
float x = min(f3Color.r, min(f3Color.g, f3Color.b));
181+
float Offset = x < 0.08 ? x - 6.25 * x * x : 0.04;
182+
f3Color -= Offset;
183+
184+
float Peak = max(f3Color.r, max(f3Color.g, f3Color.b));
185+
if (Peak >= StartCompression)
186+
{
187+
float d = 1.0 - StartCompression;
188+
float NewPeak = 1.0 - d * d / (Peak + d - StartCompression);
189+
f3Color *= NewPeak / Peak;
190+
191+
float g = 1.0 - 1.0 / (Desaturation * (Peak - NewPeak) + 1.0);
192+
f3Color = lerp(f3Color, float3(NewPeak, NewPeak, NewPeak), g);
193+
}
194+
return f3Color;
195+
}
173196
#else
174197
{
175198
return f3Color;

Shaders/PostProcess/ToneMapping/public/ToneMappingStructures.fxh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define TONE_MAPPING_MODE_ADAPTIVE_LOG 7
1919
#define TONE_MAPPING_MODE_AGX 8
2020
#define TONE_MAPPING_MODE_AGX_CUSTOM 9
21+
#define TONE_MAPPING_MODE_PBR_NEUTRAL 10
2122

2223
struct AgXAttribs
2324
{

0 commit comments

Comments
 (0)