Filmic Tonemapping固然是个好东西,然而Jim Hejl & Burgess-Dawson的原始公式在不少显示器上都显得过于鲜艳了,另外还有不少人甚至认为完全没有任何Tonemapping的画面更对他们的口味。众口难调,我们能做的就是提供一个可配置的Tonemapping,让他们自己撸去吧。
Uncharted2中的Tonemapping是可配置的,而且参数还异常丰富灵活,有A, 有B, 有C, 还有D, E, F….,具体的公式我也懒得说了,大家都知道的,不知道的自己去翻ppt。你说有这么多的参数的公式好调么?-- 我反正是搞不定了。我需要的是一个简单粗暴的公式,只能有一个参数,而且还需要这个参数的值跟画面的鲜艳程度有一个近似线性的关系。
于是把Jim Hejl & Burgess-Dawson的原始公式撸了一下,得到下面这个函数:
// C = 0.8, gamma correction only // C = 0.39, gamma correction with filmic tonemapping half3 x = ExposureAdjust(linear_color); half3 t1 = 6.2 * x * x; half3 t2 = C * x; half3 y = (t1 + t2) / (t1 + 4.1 * t2 + 0.05) + (0.634 * C - 0.247) * x;
其中 C 的取值可在[0.3, 0.9] 之间调整(你非要超过这个区间它也不介意),C值越低,画面越艳丽. 当 C=0.39时,几乎就是原始的filmic tonemapping (包含gamma correction, 如图1, 图2.) 而当 C=0.8时,就变成一个纯的 gamma correction (如图3.)
图1: C = 0.39, x 属于 [0, 1] 图2: C = 0.39, x属于[0, 10] 图3:C = 0.8, x属于[0, 1]