Marco老师好,今天看到您的这篇帖子,感到有很多头绪需要梳理,需要澄清一些事实,不然很多用户可能会被其中的信息影响。请允许我慢慢展开说。
引用您说的第一段话:
“Filmic tonemap(电影色调映射)是将HDR色域映射到LDR色域(D5里面就是Linear 到 sRGB)的优秀解决方案,由John Hable老哥发扬光大,是早已在VR和CR渲染器中提供的功能,希望D5早日在后期中加入这么重要的功能。”
我想回答两点:
- D5从其诞生第一天就集成了“Filmic tonemap”这个功能了
- 即使补上了“V-Ray”“Corona Renderer”中的“Hable”“Hejl-Dawson”等算法,大概率也不会改善现有的结果,可能至多是追平现有的体验。原因是来自于上一条。
背景知识
聊到 Tonemapping 这个话题,网上非常容易搜索到的一篇文章,恰恰也是挺不错的一篇文章,是这篇《 Tone mapping进化论》:https://zhuanlan.zhihu.com/p/21983679
这篇文章是2016年8月发表的,2016年8月这个时间节点很重要,我们看一下时间线:
- 2002年,Reinhard tone mapping 发表,这个算法 V-Ray 里有,是很经典的压高光算法,V-Ray 用户都非常熟悉。
- 2007年孤岛危机(Crysis)的CryEngine 2,为了克服 Reinhard 灰暗的缺点,自研了一个色调映射曲线。
- 2010年,顽皮狗公司公开了其游戏《神秘海域2》使用的 Filmic tone mapping 曲线,其作者正是您提到的 John Hable,这个算法被广为采用,包括上一条的 CryEngine。注意这里出现了 Filmic 这个词。“胶片色调映射”简短的历史如下:它最初的曲线是由 Haarm-Pieter Duiker 近似模拟柯达胶片响应曲线而制作的,诞生于2006年,是基于柯达胶片的响应曲线把线性信息转化到 log,然后还套了一个 LUT。而后,Jim Hejl 和 Richard-Burgess Dawson 基于此理念发现了一种更快的近似方法,应用于游戏主机 PS3 和 XBOX 360。John Hable 到了顽皮狗后,因为顽皮狗游戏需要超写实的视觉效果,修改了 Jim 和 Richard 的公式,加入了更多的控制参数(方便艺术化调整)。这个算法常被业界称为《神秘海域2》色调映射。
- 2016年1月,Krzysztof Narkowicz 的文章介绍了一种新的色调映射曲线:全称叫 ACES Filmic Tone Mapping Curve(ACES胶片色调映射曲线),选取它的原因是对《神秘海域2》中的 Filmic Tone mapping曲线解决方案不太满意。
- 2016年8月,知乎用户叛逆者发表了《Tone Mapping 进化论》这篇文章,在其文章中,ACES Filmic Tone Mapping 算法最新,效果也是最好的,是赢家。D5渲染器使用的就是这种ACES胶片色调映射。
其实,如果色调映射技术的发展就此停止的话,也许我们可以很安全的地说“D5已经使用了最好的色调映射算法。”
但实事求是地说,事情没有那么简单:
2017年3月,John Hable 公开了其迭代以后的 Filmic Tone Mapping 算法,各方面比2010的《神秘海域2》版本都更好了。
现在您也许好奇的是:“John Hable Filmic Tone Mapping 2017 改进版” 和 “ACES Filmic Tone Mapping” 谁更好呢?
讲实话,不太容易评价,我只能客观列一下它们的特性:
Hable 色调映射暴露了5个艺术家参数:
- Shoulder strength
- Linear strength
- Linear angle
- Toe strength
- White point
而 ACES 色调映射暴露了3个艺术家参数:
- Shoulder
- Linear angle
- Toe
在D5里就是这三个参数:
以下内容引用自D5帮助文档
https://cn.docs.d5render.com/effect/post-processing
Shoulder——在D5里叫“高光”
调节这个参数对tone mapping曲线影响如下:
Linear angle——在D5里叫“反差”,影响线性部分的斜率
调节这个参数对tone mapping曲线影响如下:
Toe——在D5里叫“阴影”
调节这个参数对tone mapping曲线影响如下:
再扩展点题外话,看一下V-Ray的胶片色调映射算法有几种:
可以看到有4种,分别是:
- Hable:不确定是2010版还是2017版,我希望是2017版
- Hejl-Dawson:某些意义上是Hable算法的前身,暴露了两个参数
- AMPAS:这条其实是符合ACEScg标准的曲线,V-Ray把参数写死了,不允许艺术家修改,有的艺术家很喜欢,因为它简单,有的人不喜欢,因为没法调。
- Power Curve:幂曲线算法暴露的参数很多,V-Ray 作者 Vlado 本人最喜欢这个。
可以看到,色调映射算法的目的都是一致的,实现手段各有不同,暴露出来的参数也不一样。
说到这个份上,相信您也理解,很难说哪个算法是最好的,正如您在帖子里说的:
调节不同的映射曲线,会得到不同的风格,满足不同项目不同艺术家(画图仔)的需求
您要问我哪个算法最好,没有定论。但是您要是问哪个算法更有可能成为未来的行业标准,我得说大概率是ACES。
而且,Hable色调映射算法和ACES色调映射算法各自在未来很可能还会继续迭代更新。因此这种事情是没有什么结论的,先陈述这些事实。
背景知识弄清楚了,那么接下来就可以澄清几个误会了:
D5没有 filmic tonemapping 吗?
答:不是,D5一直有 filmic tonemapping,而且还是业内公认优秀的算法。只是D5没特别进行宣传,造成了一些误解。
D5是像您的帖子中说的,只有“阴影”这么一个用于调节暗部的参数吗?
答:不是,其实是有三个控制 Tone mapping 的参数,分高光、阴影和线性部斜率三个方面来调节。
你叭叭了这么多,那为什么我总觉得 V-Ray、CR 的压高光比D5好用?
这个,请容我解释:
其实这是因为,您之前从来不知道D5有色调映射,所以从心理上,您觉得D5视口中看到的画面,和 V-Ray\CR的VFB中看到的画面没有什么实质性区别。但其实区别巨大:D5视口是已经做过色调映射的,V-Ray\CR视口默认是没做色调映射的。
在使用V-Ray工作时,默认渲染出来的画面是原始线性数据(gamma校正环节咱俩都门清,我们就不提了),经过了斜45度的色调映射曲线,也就是没调整色调映射。
那么此时如果对V-Ray默认画面套上一个色调映射,那么高亮像素立刻会被压到1.0附近,所有的高光细节都会被找回来。它是立竿见影的效果,使用体验就是:“woc,牛逼,爽。”
但是在D5中,ACES色调映射从始至终都是开启的,高光细节其实已经被压好了。再调节shoulder参数,效果就感觉不那么明显了。但其实,此时色调映射早已发挥了巨大的作用。
我这里针对上面的话,举一个例子:
如图所示,这是D5的演示场景,您可以对照着看一下,一个室内空间,室外天空背景高光细节开始看不清了:
这时候我们不禁会想,这要是在V-Ray和CR里,用那个色调映射一压,该有多爽?
然而事实是:这张图后台的原始线性数据早就过曝得离谱了,多亏了ACES tone mapping,我们才看到较为正常的画面。
我此时用D5输出该画面的原始线性数据(保存exr(原始)这个格式),直接载入V-Ray VFB中,画面其实是这样的:
这个时候,我们加上电影色调映射:
Hable算法:
进一步压高光,调整shoulder参数:
这里高光已经压到极限了。
这是官方演示场景,因此您都可以在自己的电脑上尝试。
我们对比一下D5的ACES tone mapping 和 V-Ray 的Hable tone mapping:
请千万不要误解我,我不是想说谁更好,我是想重申:即使D5引入了“Hable”“Hejl-Dawson”等算法,大概率也不会改善现有的结果,可能至多是追平现有的体验。因为D5自己已经做过色调映射了。
我们之所以觉得CR和V-Ray的压高光有效,是因为在CR\V-Ray软件中,用户看得到从45°色调映射曲线,切换到 filmic tonemapping 曲线时,那种立竿见影的变化。
而用户之所以认为 D5 的 tone mapping 高光滑竿不给力,其实是因为用户一直挂着 tonemapping 画图,用户并不知道:“其实高光已经压好了”
所以,这篇帖子的愿望是良好的,可惜盲目引入同类型色调映射算法,不能解决您说的问题。因为:
- D5已经有Filmic tone mapping了
- D5色调映射已经把图从这样:
变成这样了:
D5内心OS:你到底还要我怎样。
我想:但凡 D5 像 V-Ray/CR 一样,把这个切换过程暴露出来,可能会收获很多“惊呼”和“赞美”吧?但是在实时渲染体验中,原始线性数据是没有展示的必要性的,画面一定是要过tone mapping才能带给人更真实的交互体验。
至于这个假想的流程图:
很不好意思,这个图确实不对,误解很多。
澄清一下:D5实际的过程是这样的:
第一行是数据和后期参数的关系:原始线性数据先是过后期处理(包括色温、饱和度这些),然后过ACES Filmic Tone Mapping,最后根据用户的需要输出 exr(线性数据)或者 png等(8位深度 sRGB图片)
第二行是不同步骤不同阶段的产出,对应着不同的出图格式。
上面提到的每一步都是可以验证的,您在这里修改输出格式就可以验证:
那将来怎么改?
您的帖子中提到了很多有价值的改进点,开发人员今天也与我讨论了很多。
对于暗部在后期调整时死黑,出于实时显示的显存带宽的考虑,画面的数据精度确实没做到极高,导致后期余地不理想,这个应该可以想办法解决,但是这其中的取舍,我们要再仔细考虑。
另外对于已经压过高光的画面再怎么压高光这个套娃问题,开发今天也提出了一些想法,我们会试试,请您拭目以待。
总之,非常感谢您的建议!