后期增加 Filmic tonemap (电影色调映射)功能

Filmic tonemap(电影色调映射)是将HDR色域映射到LDR色域(D5里面就是Linear 到 sRGB)的优秀解决方案,由John Hable老哥发扬光大,是早已在VR和CR渲染器中提供的功能,希望D5早日在后期中加入这么重要的功能。


这位老哥在他的博客里面很详细的介绍了Filmic tonemap的原理,http://filmicworlds.com/blog/filmic-tonemapping-with-piecewise-power-curves/

Filmic tonemap的好处有2个:
第一个是可以控制同时保留高亮和暗部的细节,而且能单独调节高亮部分和暗部的表现。
我们拿效果明显的场景来做对比,比如从室内望向晴朗天气的室外的场景,如下面三张图,它们光照条件相似


查资料可以了解到室外和室内照度大概处于什么范围,室外照度约50000lux,室内约100lux,照度比约500:1
(见:wikipedia https://en.wikipedia.org/wiki/Daylight
《GB 50034-2013建筑照明设计标准》
https://www.mohurd.gov.cn/gongkai/fdzdgknr/tzgg/201312/20131211_224901.html
http://www.jianbiaoku.com/webarbs/book/49/1044494.shtml
三张图片都能看清室内的细节,但最左边照片室外过曝了,看不清室外细节,中间照片室外有一点点过曝,最右边则能清晰看到室外细节。其实就是相机对性能功能上的区别(表现HDR的能力)导致。
我们在渲染器中制作类似的场景,首先保证模拟现实情况光照,只通过后期调整,而不是调整太阳光强度来影响室外亮度。
先来看CR的

视频https://pan.baidu.com/s/1cBMDSWGOZJiLk4uYQOKomQ?pwd=6666
很明显shoulder调节亮部,toe调节暗部,可以独立调节,而D5只有阴影一项调节暗部,而且调节起来还对亮部有明显影响,没有其他地方可以对亮部单独调节,给人感觉是后期和映射sRGB的顺序反了,这个解释比较长,后面我再演示,反正调节起来不对劲,不是这种感觉。

第二优点是调节不同的映射曲线,会得到不同的风格,满足不同项目不同艺术家(画图仔)的需求
这次我们来看VR中的Flimic tonemap,VR甚至给出了映射曲线的样子,这让我们直观的感受到不同曲线类型的对应的画面艺术风格:

比如,“耸肩”型曲线,画面的亮部到暗部的过渡有明显的落差,有强烈对比效果


“正常肩”型曲线,画面对亮部和暗部的过渡比刚才平缓

“溜肩”型曲线,画面对比度低,看起来光照比较均匀

而D5没法很好的调节映射的类型风格

接下来解释刚才说的阴影调节感觉不对劲的问题:
在Vray中用Filmic tonemap调暗部


在D5中用阴影调暗部

留意在暗部中白色的餐桌,vr的filmic tonemap调暗部是把整个空间亮度压下去的,D5做不到,我要是想压暗室内,调阴影的话,餐桌的白色被当成亮部,被突出出来,达不到我想要的效果。(也不是调D5曝光,曝光是全局调,同时影响了室外亮部)
这让我感觉D5在处理映射和后期的顺序反了,或者没能让我们在linear色域中有更多机会调节图像。

给我感觉像这样,要是映射sRGB后再调一些后期参数,图像上就有信息丢失,应该在A阶段调才对。

好了,总的来说,就是D5后期不好调,跟vr和cr有差距,所以建议后期增加Filmic tonemap功能(提升映射前A阶段的后期调节能力)。

(D5团队自己应该多做项目,在Vr和Cr上感受下它们后期的强大,尤其是Cr,说再多都不如你们自己实践感受,而且还有其他好的地方我没说到的。

Marco老师好,今天看到您的这篇帖子,感到有很多头绪需要梳理,需要澄清一些事实,不然很多用户可能会被其中的信息影响。请允许我慢慢展开说。

引用您说的第一段话:

“Filmic tonemap(电影色调映射)是将HDR色域映射到LDR色域(D5里面就是Linear 到 sRGB)的优秀解决方案,由John Hable老哥发扬光大,是早已在VR和CR渲染器中提供的功能,希望D5早日在后期中加入这么重要的功能。”

我想回答两点:

  1. D5从其诞生第一天就集成了“Filmic tonemap”这个功能了
  2. 即使补上了“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里就是这三个参数:
图片1
以下内容引用自D5帮助文档
https://cn.docs.d5render.com/effect/post-processing

Shoulder——在D5里叫“高光”
调节这个参数对tone mapping曲线影响如下:
16 高光参数动画

Linear angle——在D5里叫“反差”,影响线性部分的斜率
调节这个参数对tone mapping曲线影响如下:
21 反差参数动画

Toe——在D5里叫“阴影”
调节这个参数对tone mapping曲线影响如下:
19 阴影参数动画

再扩展点题外话,看一下V-Ray的胶片色调映射算法有几种:
图片2
可以看到有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度的色调映射曲线,也就是没调整色调映射。
图片3
那么此时如果对V-Ray默认画面套上一个色调映射,那么高亮像素立刻会被压到1.0附近,所有的高光细节都会被找回来。它是立竿见影的效果,使用体验就是:“woc,牛逼,爽。”
图片4

但是在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 画图,用户并不知道:“其实高光已经压好了”

所以,这篇帖子的愿望是良好的,可惜盲目引入同类型色调映射算法,不能解决您说的问题。因为:

  1. D5已经有Filmic tone mapping了
  2. D5色调映射已经把图从这样:

    变成这样了:

    D5内心OS:你到底还要我怎样。

我想:但凡 D5 像 V-Ray/CR 一样,把这个切换过程暴露出来,可能会收获很多“惊呼”和“赞美”吧?但是在实时渲染体验中,原始线性数据是没有展示的必要性的,画面一定是要过tone mapping才能带给人更真实的交互体验。

至于这个假想的流程图:


很不好意思,这个图确实不对,误解很多。

澄清一下:D5实际的过程是这样的:


第一行是数据和后期参数的关系:原始线性数据先是过后期处理(包括色温、饱和度这些),然后过ACES Filmic Tone Mapping,最后根据用户的需要输出 exr(线性数据)或者 png等(8位深度 sRGB图片)
第二行是不同步骤不同阶段的产出,对应着不同的出图格式。

上面提到的每一步都是可以验证的,您在这里修改输出格式就可以验证:
图片14

那将来怎么改?

您的帖子中提到了很多有价值的改进点,开发人员今天也与我讨论了很多。

对于暗部在后期调整时死黑,出于实时显示的显存带宽的考虑,画面的数据精度确实没做到极高,导致后期余地不理想,这个应该可以想办法解决,但是这其中的取舍,我们要再仔细考虑。

另外对于已经压过高光的画面再怎么压高光这个套娃问题,开发今天也提出了一些想法,我们会试试,请您拭目以待。

总之,非常感谢您的建议!

4 个赞

感谢张老师回复,辛苦了,我又学到了很多东西!

D5里面有一套映射参数控制的,只是表现为现在的“高光”“阴影”“反差”。所以显然我是有误解的。
但是如果把我产生误解(总认为vr cr比D5图像好调)的过程分析一下,就会看到最开始不是这些专业知识,最开始是用户体验的感觉,也就是说D5的这三个参数调节起来觉得不好调,不容易调,哪里怪怪的开始,我开始思考D5跟那两兄弟渲染器在后期上到底有什么区别,然后开始自己找点资料看,最终走向误解。
就是不管误解存不存在,那种不好调的感觉是真实存在的。就比如我帖子上说,vr调节toe时,是整个空间压暗,连那张桌子也压暗,这种是符合我预期的操作。而现在D5只调阴影不行,要三个参数一起调才能出现那种效果,就一个是操作上要多调节两个参数,另一个是不符合心里预期。

“D5内心OS:你到底还要我怎样。”这我也没办法再进一步表达了 :rofl:,我的知识在这一块已经见底了。

所以到底是哪里不好调。。。
我剩下的能提供给你们的信息是关于美学方面的,可能有点价值(感觉也有点往哲学方向探讨了 :rofl:):
我们在设计一个画面时,跟画画是一样的,先确定画面整体大关系,再深入细节。反映到后期调节的流程中就是:
1.场景整体明暗关系 → 2.整体的颜色 → 3.单独对象的细节 → 4.画面特殊艺术效果(或者问下女生拍完照片后期怎么p图的,都差不多的流程)
明暗关系我们讲五大调(其中一种):高光,亮部,灰调(中间调),暗部,反光。(反光这里用不上,看前四个就好)
(注意第一步是整体的明暗关系,不是局部的明暗关系)


我们作为画图的心里预期就是后期参数里面有能够调节到相应区域的参数可以独立调节,最好不是联调。参数的名字上可能有所不同,毕竟不是p图软件。

所以你刚才说哪种算法更好的时候,我觉得毕竟渲染器做出来是给艺术家用的,要从艺术家的角度去看,我们是怎么设计一个画面的,从中脱颖而出的算法(以及它提供的可调参数)是那个最能帮助我们以我们角度和流程快速画出满意效果图的算法。这下有方向了吧,这就是努力的方向 :smile:

现在回过头来看,vrcr和d5调节起来感觉上的差异可能在这里,你看,在第1步调整场景整体明暗关系中,vr 的Hable算法里,只配合曝光就基本满足了我想要调高光,亮部,灰调,暗部的需求,shoulder调亮部,linear调灰调,toe调暗部,white point调高光,很直观,符合我刚说的“心里预期就是后期参数里面有能够调节到相应区域的参数可以独立调节”,当然这4个参数不是直接对应4大调,但感觉到位了,就是这种感觉。
对比power curve算法,power curve 的contrast跟Hable的linear相比差远了,没有能够对灰调直观的调节,要配合shoulder和toe去调,vr作者喜欢power curve的话,我只能说他写代码很好,但不是一位艺术家。
D5目前就更不用说了,相比之下更不好调。

有了这个方向,其实一切很明朗了,D5不管怎么优化算法,UI上应该能有让我们可以直观控制高光,亮部,灰调,暗部的交互(依然,这里说的是整体,不是局部)

未来理想的后期调节,是符合艺术家工作流程的,直观简单效率的,大概是这样(个人看法,但我觉得是对的):
配合曝光的前提下

  1. 场景整体明暗关系:提供可以单独且直观控制整体高光,亮部,灰调,暗部的功能参数,参数的名字接近,能做到顾名思义。(这里的单独不是绝对单独,多少都会相互影响,比如调暗部时,多多少少影响了灰调,但感觉到位)
  2. 整体颜色:白平衡,色调,lut等等
  3. 单独对象细节:对比度,锐化等等
  4. 画面特殊艺术效果:泛光,镜头光晕,暗角等等

我虽然不是艺术家,但画图都不是凭感觉的,每一步都是有理论基础的,一张图片美的底层都是理性的,不是感性的。优秀的映射算法以及后期功能也是一定有标准和方向的,我认为上面所说的就是一个简单的方向。
至于怎么优化算法,就靠你们了,干巴爹 :grin:~(要快啊)

2 个赞

也许拿EXR(原始)可以为所欲为。爱怎么映射就怎么映射 :smile: 自己画曲线映射是不是也可以。

2 个赞

虽然俺也不是很懂,听上去是D5怕我傻不会调默认给挂了个外挂处理,虽然处理的很好,但让我不能认清现实,其实如果我看得到原图的话我可能希望原图就不是过曝的那张,然后再给我挂个外挂优化,效果会不会更加稳定可控一点?

@228057408 “其实如果我看得到原图的话我可能希望原图就不是过曝的那张,然后再给我挂个外挂优化,效果会不会更加稳定可控一点?” :smiling_face_with_tear: :point_down:

“希望原图就不是过曝的那张”的想法确实美好。但是如果没有 tone mapping,你是永远拿不到下面那张不过曝的效果的。

原始线性数据一幅画面只能容纳11档曝光,而下面一幅图已经是把更大的曝光范围压到LDR范围内的结果。

想要给已经tone mapping过的画面再压高光,只能想想别的办法了,我们会尝试一些新方案。

我今天有了些新想法,如果D5允许把tone mapping临时关掉。这样作图的视口就和V-Ray、CR默认VFB对齐了。在这种情况下,开启色调映射的效果才能得到直观公平的比较,到时候会邀请各位用户参与手感的内测评估。

我不是想原图就拿到下面那张不过曝的效果,而是说不管效果怎么样正常人调曝光不会调到第一张那么过曝的效果。还是说一定要把曝光调到过曝然后靠tone mapping自动调整,得到的图才可能是最佳的?不能是我原图先曝光正常一点,然后再开tonemapping什么的后期优化到最佳?到底哪一种方式是更符合物理渲染准确的?

张大白和韩式鳞是什么关系

不是说关了tonemapping,算法继续优化就好了 :joy:



你给我看的D5阴影压暗部的算法感觉是不太好的,太硬了


D5的阴影把暗部压下去后,a点附近信息被压没了,所以死黑,b点的转折过渡太“突兀”,曲线在这里的G3变化太大了(斜率的导数是G2还是G3,忘了),调节toe时对c点linear区域影响过大了(本来linear区域就那么一点,压完后变3倍了,就给人感觉明明时调toe,但却不小心调了太多linear),
下面这样压暗部比较好吧

对的,我认同你的观点,如果不开着色调映射,用户应该不至于把原图就调曝成那个样子,用光会无形中就有一定控制。现在一直挂着tone mapping,操作起来,打起光来有可能会过大而不自知。如果我们允许用户在工作中看到原始线性数据,灯光就不会失控,进而色调映射工具的作用也能得到体现。我觉得这件事值得测一下试试。

M老师,死黑的问题是数据精度问题,我们会权衡一下,实时的显存带宽还是比较重要的。

这名字一共三个字,错了俩。

理论性不错,似懂非懂,感觉支持楼主提议,从用户角度,调了参数有大的效果这才是好参数,所见即所得,这很重要,这不就是交互体验吗?很关键的。而不是程序员大师在后台用程序手法操作好了让我们认可,这时候已经不大好调了或者说调不好了。

举个例子,有些不喜欢苹果手机系统的人认为系统很多细部不可定制,而华为鸿蒙就很好定制比较灵活,但苹果公司的程序员肯定认为我的系统是最好的,我都优化到极致了你们用就行了。但是用安卓、鸿蒙的用户很多不认可苹果系统,这个道理类似。设计师思维和程序员的思维还是有区别的。

画曲线映射,哈哈,好主意,像PS里面调曲线一样,想什么形状,自己拉出来,哈哈,真的是值得考虑的想法@张大白老师

可以考虑哎,不是开玩笑的,自己加控制点,自己拉曲线,在某种制定的规则下
这是PS 的camera raw滤镜的调曲线的功能,PS也是分四档控制,高光,亮部,灰调,暗部,名字不同,意思一样

调节参数的时候让我们看到映射曲线的图像变化,更进一步的话,可以试着允许用户在曲线上自己控制

这张图我也是用D5渲染,然后导出exr,放到vr中用Hable算法调,调toe使得暗部看清细节,画面会保持通透感,不会变灰


但在D5中调阴影时,画面会变得灰灰的

可以试试
链接:https://pan.baidu.com/s/1ikZW8fxE4lw4K6VzXJQxrw?pwd=6666
提取码:6666
–来自百度网盘超级会员V6的分享

非常感谢这个测试。这是您把输入数据对齐以后,仍然表示Hable算法更好,那这个测试说服力就很强了。我们可以尝试把Hable tone mapping集成到D5中。