Skip to content

Commit 0ac8404

Browse files
committed
(khronos pbr) natural tonemap
1 parent 08545b1 commit 0ac8404

File tree

6 files changed

+23
-39
lines changed

6 files changed

+23
-39
lines changed
Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
$include vertex.glsl
32

43
$define shader fragment
@@ -7,37 +6,38 @@ layout(binding = 0) uniform sampler2D texColor;
76

87
layout(std140, binding = 2) uniform Tonemap
98
{
10-
vec4 tonemapFirst; // shoulderStrength, linearStrength, linearAngle, toeStrength
11-
vec4 tonemapSecond; // toeNumerator, toeDenominator, white, tonemapEnabled
12-
vec4 gammaParams; // gamma
9+
vec4 params; // gamma, tonemapEnabled
1310
};
1411

1512
out vec3 outColor;
1613

17-
vec3 uncharted2Tonemap(vec3 x)
14+
// https://github.com/KhronosGroup/ToneMapping/blob/main/PBR_Neutral/pbrNeutral.glsl
15+
vec3 neutralToneMapping(vec3 color)
1816
{
19-
float shoulderStrength = tonemapFirst[0];
20-
float linearStrength = tonemapFirst[1];
21-
float linearAngle = tonemapFirst[2];
22-
float toeStrength = tonemapFirst[3];
23-
float toeNumerator = tonemapSecond[0];
24-
float toeDenominator = tonemapSecond[1];
25-
return ((x * (shoulderStrength * x + linearAngle * linearStrength) + toeStrength * toeNumerator) / (x * (shoulderStrength * x + linearStrength) + toeStrength * toeDenominator)) - toeNumerator / toeDenominator;
17+
const float startCompression = 0.8 - 0.04;
18+
const float desaturation = 0.15;
19+
float x = min(color.r, min(color.g, color.b));
20+
float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;
21+
color -= offset;
22+
float peak = max(color.r, max(color.g, color.b));
23+
if (peak < startCompression) return color;
24+
const float d = 1. - startCompression;
25+
float newPeak = 1. - d * d / (peak + d - startCompression);
26+
color *= newPeak / peak;
27+
float g = 1. - 1. / (desaturation * (peak - newPeak) + 1.);
28+
return mix(color, newPeak * vec3(1, 1, 1), g);
2629
}
2730

2831
void main()
2932
{
3033
vec3 color = texelFetch(texColor, ivec2(gl_FragCoord.xy), 0).xyz;
3134

3235
// tone mapping
33-
if (tonemapSecond[3] > 0.5)
34-
{
35-
const float exposureBias = 2;
36-
color = uncharted2Tonemap(color * exposureBias) / uncharted2Tonemap(vec3(tonemapSecond[2]));
37-
}
36+
if (params[1] > 0.5)
37+
color = neutralToneMapping(color);
3838

3939
// gamma correction
40-
color = pow(color, vec3(gammaParams[0]));
40+
color = pow(color, vec3(params[0]));
4141

4242
outColor = color;
4343
}

sources/include/cage-engine/sceneScreenSpaceEffects.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ namespace cage
2323
ScreenSpaceAmbientOcclusion ssao;
2424
ScreenSpaceBloom bloom;
2525
ScreenSpaceEyeAdaptation eyeAdaptation;
26-
ScreenSpaceTonemap tonemap;
2726
ScreenSpaceDepthOfField depthOfField;
2827
Real gamma = 2.2;
2928
ScreenSpaceEffectsFlags effects = ScreenSpaceEffectsFlags::Default;

sources/include/cage-engine/screenSpaceEffects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ namespace cage
4848
TextureHandle outColor;
4949
};
5050

51-
struct CAGE_ENGINE_API ScreenSpaceTonemapConfig : public ScreenSpaceCommonConfig, public ScreenSpaceTonemap
51+
struct CAGE_ENGINE_API ScreenSpaceTonemapConfig : public ScreenSpaceCommonConfig
5252
{
5353
TextureHandle inColor;
5454
TextureHandle outColor;

sources/include/cage-engine/screenSpaceEffectsProperties.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,6 @@ namespace cage
4545
uint32 blurPasses = 5;
4646
Real threshold = 1;
4747
};
48-
49-
struct CAGE_ENGINE_API ScreenSpaceTonemap
50-
{
51-
Real shoulderStrength = 0.15;
52-
Real linearStrength = 0.5;
53-
Real linearAngle = 0.1;
54-
Real toeStrength = 0.2;
55-
Real toeNumerator = 0.02;
56-
Real toeDenominator = 0.3;
57-
Real white = 11.2;
58-
};
5948
}
6049

6150
#endif // guard_screenSpaceEffectsProperties_h_0156sdrf4treth1

sources/libengine/graphics/renderPipeline.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,11 +1186,10 @@ namespace cage
11861186
{
11871187
ScreenSpaceTonemapConfig cfg;
11881188
(ScreenSpaceCommonConfig &)cfg = commonConfig;
1189-
(ScreenSpaceTonemap &)cfg = data.effects.tonemap;
11901189
cfg.inColor = texSource;
11911190
cfg.outColor = texTarget;
1192-
cfg.tonemapEnabled = any(data.effects.effects & ScreenSpaceEffectsFlags::ToneMapping);
11931191
cfg.gamma = any(data.effects.effects & ScreenSpaceEffectsFlags::GammaCorrection) ? data.effects.gamma : 1;
1192+
cfg.tonemapEnabled = any(data.effects.effects & ScreenSpaceEffectsFlags::ToneMapping);
11941193
screenSpaceTonemap(cfg);
11951194
std::swap(texSource, texTarget);
11961195
}

sources/libengine/graphics/screenSpaceEffects.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,13 +340,10 @@ namespace cage
340340

341341
struct Shader
342342
{
343-
ScreenSpaceTonemap tonemap; // 7 reals
344-
Real tonemapEnabled;
345-
Vec4 gamma;
343+
Vec4 params; // gamma, tonemapEnabled
346344
} s;
347-
s.tonemap = config;
348-
s.tonemapEnabled = config.tonemapEnabled;
349-
s.gamma = Vec4(1.0 / config.gamma, 0, 0, 0);
345+
s.params[0] = 1.0 / config.gamma;
346+
s.params[1] = config.tonemapEnabled;
350347
q->universalUniformStruct(s, 2);
351348

352349
q->colorTexture(fb, 0, config.outColor);

0 commit comments

Comments
 (0)