diff options
author | Lukas Rusak <lorusak@gmail.com> | 2021-10-13 20:28:39 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-13 20:28:39 -0700 |
commit | 9da4eb67b50493ef893a13832baadb9f99d1b925 (patch) | |
tree | 7b80533581f6e6a72c7a34ecddb6743e9744c26a /system | |
parent | 7b1dc06f137750f6857ffc907fb053c863297d5c (diff) | |
parent | f1b51923a5e63bc4a1ee3472c1b74f33a557a269 (diff) |
Merge pull request #20157 from lrusak/gles-tonemapping-method
[GLES] add ACES and Hable tone mapping
Diffstat (limited to 'system')
-rw-r--r-- | system/shaders/GLES/2.0/gles_tonemap.frag | 50 | ||||
-rw-r--r-- | system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag | 19 | ||||
-rw-r--r-- | system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag | 19 |
3 files changed, 82 insertions, 6 deletions
diff --git a/system/shaders/GLES/2.0/gles_tonemap.frag b/system/shaders/GLES/2.0/gles_tonemap.frag index 4a98f56dbb..28b2402700 100644 --- a/system/shaders/GLES/2.0/gles_tonemap.frag +++ b/system/shaders/GLES/2.0/gles_tonemap.frag @@ -1,4 +1,50 @@ -float tonemap(float val) +#if (defined(KODI_TONE_MAPPING_ACES) || defined(KODI_TONE_MAPPING_HABLE)) +const float ST2084_m1 = 2610.0 / (4096.0 * 4.0); +const float ST2084_m2 = (2523.0 / 4096.0) * 128.0; +const float ST2084_c1 = 3424.0 / 4096.0; +const float ST2084_c2 = (2413.0 / 4096.0) * 32.0; +const float ST2084_c3 = (2392.0 / 4096.0) * 32.0; +#endif + +#if defined(KODI_TONE_MAPPING_REINHARD) +float reinhard(float x) { - return val * (1.0 + val / (m_toneP1 * m_toneP1)) / (1.0 + val); + return x * (1.0 + x / (m_toneP1 * m_toneP1)) / (1.0 + x); } +#endif + +#if defined(KODI_TONE_MAPPING_ACES) +vec3 aces(vec3 x) +{ + float A = 2.51; + float B = 0.03; + float C = 2.43; + float D = 0.59; + float E = 0.14; + return (x * (A * x + B)) / (x * (C * x + D) + E); +} +#endif + +#if defined(KODI_TONE_MAPPING_HABLE) +vec3 hable(vec3 x) +{ + float A = 0.15; + float B = 0.5; + float C = 0.1; + float D = 0.2; + float E = 0.02; + float F = 0.3; + return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; +} +#endif + +#if (defined(KODI_TONE_MAPPING_ACES) || defined(KODI_TONE_MAPPING_HABLE)) +vec3 inversePQ(vec3 x) +{ + x = pow(max(x, 0.0), vec3(1.0 / ST2084_m2)); + x = max(x - ST2084_c1, 0.0) / (ST2084_c2 - ST2084_c3 * x); + x = pow(x, vec3(1.0 / ST2084_m1)); + return x; +} +#endif + diff --git a/system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag b/system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag index ecd82b13ca..d76a3b89e4 100644 --- a/system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag +++ b/system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag @@ -34,6 +34,7 @@ uniform mat3 m_primMat; uniform float m_gammaDstInv; uniform float m_gammaSrc; uniform float m_toneP1; +uniform float m_luminance; uniform vec3 m_coefsDst; uniform float m_alpha; @@ -66,9 +67,23 @@ void main() rgb.rgb = max(vec3(0), m_primMat * rgb.rgb); rgb.rgb = pow(rgb.rgb, vec3(m_gammaDstInv)); -#if defined(XBMC_TONE_MAPPING) +#if defined(KODI_TONE_MAPPING_REINHARD) float luma = dot(rgb.rgb, m_coefsDst); - rgb.rgb *= tonemap(luma) / luma; + rgb.rgb *= reinhard(luma) / luma; + +#elif defined(KODI_TONE_MAPPING_ACES) + rgb.rgb = inversePQ(rgb.rgb); + rgb.rgb *= (10000.0 / m_luminance) * (2.0 / m_toneP1); + rgb.rgb = aces(rgb.rgb); + rgb.rgb *= (1.24 / m_toneP1); + rgb.rgb = pow(rgb.rgb, vec3(0.27)); + +#elif defined(KODI_TONE_MAPPING_HABLE) + rgb.rgb = inversePQ(rgb.rgb); + rgb.rgb *= m_toneP1; + float wp = m_luminance / 100.0; + rgb.rgb = hable(rgb.rgb * wp) / hable(vec3(wp)); + rgb.rgb = pow(rgb.rgb, vec3(1.0 / 2.2)); #endif #endif diff --git a/system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag b/system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag index 22d672dd14..a82de9d8db 100644 --- a/system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag +++ b/system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag @@ -36,6 +36,7 @@ uniform mat3 m_primMat; uniform float m_gammaDstInv; uniform float m_gammaSrc; uniform float m_toneP1; +uniform float m_luminance; uniform vec3 m_coefsDst; void main() @@ -87,9 +88,23 @@ void main() rgb.rgb = max(vec3(0), m_primMat * rgb.rgb); rgb.rgb = pow(rgb.rgb, vec3(m_gammaDstInv)); -#if defined(XBMC_TONE_MAPPING) +#if defined(KODI_TONE_MAPPING_REINHARD) float luma = dot(rgb.rgb, m_coefsDst); - rgb.rgb *= tonemap(luma) / luma; + rgb.rgb *= reinhard(luma) / luma; + +#elif defined(KODI_TONE_MAPPING_ACES) + rgb.rgb = inversePQ(rgb.rgb); + rgb.rgb *= (10000.0 / m_luminance) * (2.0 / m_toneP1); + rgb.rgb = aces(rgb.rgb); + rgb.rgb *= (1.24 / m_toneP1); + rgb.rgb = pow(rgb.rgb, vec3(0.27)); + +#elif defined(KODI_TONE_MAPPING_HABLE) + rgb.rgb = inversePQ(rgb.rgb); + rgb.rgb *= m_toneP1; + float wp = m_luminance / 100.0; + rgb.rgb = hable(rgb.rgb * wp) / hable(vec3(wp)); + rgb.rgb = pow(rgb.rgb, vec3(1.0 / 2.2)); #endif #endif |