aboutsummaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
authorLukas Rusak <lorusak@gmail.com>2021-10-13 20:28:39 -0700
committerGitHub <noreply@github.com>2021-10-13 20:28:39 -0700
commit9da4eb67b50493ef893a13832baadb9f99d1b925 (patch)
tree7b80533581f6e6a72c7a34ecddb6743e9744c26a /system
parent7b1dc06f137750f6857ffc907fb053c863297d5c (diff)
parentf1b51923a5e63bc4a1ee3472c1b74f33a557a269 (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.frag50
-rw-r--r--system/shaders/GLES/2.0/gles_yuv2rgb_basic.frag19
-rw-r--r--system/shaders/GLES/2.0/gles_yuv2rgb_bob.frag19
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