From 15bb05d2fe7394478144d323a41023722d1a9d38 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Mon, 30 May 2016 12:48:01 +0200 Subject: vo_opengl: add hable tone-mapping algorithm Developed by John Hable for use in Uncharted 2. Also used by Frictional Games in SOMA. Originally inspired by a filmic tone mapping algorithm created by Kodak. From http://frictionalgames.blogspot.de/2012/09/tech-feature-hdr-lightning.html --- DOCS/man/vo.rst | 3 +++ video/out/opengl/video.c | 1 + video/out/opengl/video.h | 1 + video/out/opengl/video_shaders.c | 11 +++++++++++ 4 files changed, 16 insertions(+) diff --git a/DOCS/man/vo.rst b/DOCS/man/vo.rst index 1f1e40ec00..717c4738a9 100644 --- a/DOCS/man/vo.rst +++ b/DOCS/man/vo.rst @@ -1074,6 +1074,9 @@ Available video output drivers are: reinhard Reinhard tone mapping algorithm. Very simple continuous curve. Preserves dynamic range and peak but uses nonlinear contrast. + hable + Similar to ``reinhard`` but preserves dark contrast better (slightly + sigmoidal). Developed by John Hable for use in video games. gamma Fits a logarithmic transfer between the tone curves. linear diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c index 7bfcf17e2a..380e768126 100644 --- a/video/out/opengl/video.c +++ b/video/out/opengl/video.c @@ -385,6 +385,7 @@ const struct m_sub_options gl_video_conf = { OPT_CHOICE("hdr-tone-mapping", hdr_tone_mapping, 0, ({"clip", TONE_MAPPING_CLIP}, {"reinhard", TONE_MAPPING_REINHARD}, + {"hable", TONE_MAPPING_HABLE}, {"gamma", TONE_MAPPING_GAMMA}, {"linear", TONE_MAPPING_LINEAR})), OPT_FLOAT("tone-mapping-param", tone_mapping_param, 0), diff --git a/video/out/opengl/video.h b/video/out/opengl/video.h index 5b837ca3ad..a4a9fb703b 100644 --- a/video/out/opengl/video.h +++ b/video/out/opengl/video.h @@ -106,6 +106,7 @@ enum prescalers { enum tone_mapping { TONE_MAPPING_CLIP, TONE_MAPPING_REINHARD, + TONE_MAPPING_HABLE, TONE_MAPPING_GAMMA, TONE_MAPPING_LINEAR, }; diff --git a/video/out/opengl/video_shaders.c b/video/out/opengl/video_shaders.c index 911bf377c7..d940c415e8 100644 --- a/video/out/opengl/video_shaders.c +++ b/video/out/opengl/video_shaders.c @@ -335,6 +335,17 @@ void pass_tone_map(struct gl_shader_cache *sc, float peak_src, float peak_dst, break; } + case TONE_MAPPING_HABLE: { + float A = 0.15, B = 0.50, C = 0.10, D = 0.20, E = 0.02, F = 0.30; + GLSLHF("vec3 hable(vec3 x) {\n"); + GLSLHF("return ((x * (%f*x + %f)+%f)/(x * (%f*x + %f) + %f)) - %f;\n", + A, C*B, D*E, A, B, D*F, E/F); + GLSLHF("}\n"); + + GLSLF("color.rgb = hable(color.rgb) / hable(vec3(%f));\n", scale); + break; + } + case TONE_MAPPING_GAMMA: { float gamma = isnan(param) ? 1.8 : param; GLSLF("color.rgb = pow(color.rgb / vec3(%f), vec3(%f));\n", -- cgit v1.2.3