五毛特效与好莱坞的差距……99%的人都不知道的原因
CG渲染,为什么渲出来的东西怎么调都感觉不像真的?即使在材质、贴图上花再多功夫,最终的效果还是感觉像“渲”的,为什么做不到照片的真实感?
为什么我们只能做五毛,好莱坞大片里的场景为什么可以如此写实?
取这个标题绝不意味这是什么广告软文,而是一篇正经严肃的科普文。希望看过的朋友动动手指转发出去,让更多的人知道,一个99.99%的人都没有意识到的问题。
为了写这篇推送,本人尽最大所能查阅了N多资料,如有业界大佬发现纰漏,欢迎留言指正。
▌了解什么是Dynamic Range
为了说明CG渲染如何做到真实,我们首先要从照相机的原理说起。CG渲染,其实就是一架虚拟照相机。
当我们用相机拍摄一个背对阳光的人物,默认状态下人物会变得比较黑。如果你将焦点对准人物,人物会变得“白起来”,但相应的背景天空会过曝,几乎看不清细节。这是由“曝光点”引起的。
被聚焦的物体会被自动调节成“中灰”颜色。照相机能展现的色彩范围是有一定限度的,它只能记录所能展现的最亮与最暗颜色之间的颜色。而超过了这个范围的颜色,会被统统过滤掉,这就是我们经常在照片中看到的“死黑”或“过曝”的区域。
照相机以“中灰”为基准点,所能记录的最亮和最暗的色彩范围,就叫Dynamic Range。一个相机的Dynamic Range越大,拍摄出来的照片就越好。
普通廉价相机最大可以拍摄到11左右的颜色范围,dSLRs相机的最大范围是14左右,而我们影视拍摄常用的摄像机最大可以拍摄到15,而我们人眼所能看到的最大颜色范围是20,远远超过了这些相机所能记录的范围值。
而我们的三维软件的Dynamic Range又是多少呢?比较有趣了,最大只能展现7-8左右的颜色范围,连一部廉价相机都不如。图示标注的是Blender软件,但请你们相信我,所有市面上能接触到的三维软件的默认设置都是这个水平,因为它们都使用了sRGB颜色模式。
▌传统sRGB模式的缺陷
这会造成什么后果呢?
像图示这种场景,无论如何调高灯光强度,仍然感觉屋子很暗。做过渲染的朋友有没有这种体会?原因就在于,三维软件的默认颜色模式使用了sRGB,这种模式最大只能看到7-8左右的颜色范围,再亮的颜色全部会被“吃掉”。
摄像机拍摄的照片数据全部是“0”、“1”这种二进制形式存储的,要把这些数据转变成我们能看到的图像,就需要Color Transform颜色转换。
这里还是以blender为例,在三维软件中,渲染器其实就是一个虚拟的摄像机,它的原理跟真实的相机并无差别,因此,渲染完的二进制数据要想转成图像,就需要Color Transform,而传统的sRGB模式的Dynamic Range非常小,这就造成了很大的问题——很大一部分颜色根本无法显示,更别提细节了,亮部与暗部过渡生硬……最终导致效果看着很假。这种情况在具有高强度光源的场景里尤为突出,例如爆炸,光线强度很容易就超过sRGB的上限。
为什么sRGB模式这么坑爹?历史原因。这种颜色模式是适用于古老的CRT晶体管显示器的,竟然被一直沿用到了今天……看到这里你可能会想,为什么过去这么多年,没有人发现这个问题?软件公司为什么要一直使用早该被废弃了的sRGB模式?
还是历史原因。由于了解这个领域的人少之又少,当CRT时代sRGB被选用后,并没有人发现它的弊端,就被稀里糊涂的沿用起来了。而多少年过去了,有人发现了这个问题,但习惯和生态早已形成,无数艺术家已经“习惯”在sRGB模式下去工作,很难说服大众改变这个观念。这也是本文诞生的意义。
可以肯定的一点是,像好莱坞这种世界领先的视效公司早已废弃了sRGB。去过好莱坞的人少之又少,而好莱坞的技术又对外封闭,我们就被“骗”了这么多年……
希望可以让更多的人看到,意识到这个问题,也许在不久的将来,sRGB可以“堂而皇之”地宣告终结。
“sRGB永远不应该被用于CG渲染。”
▌故事还没完……
sRGB模式不光Dynamic Range小的可怜,其带来的另一个弊端是,无法实现高强度光照下的“Color desaturation”。什么意思呢?
仔细观察电影镜头里的颜色,在光线充足的场景里,物体颜色的饱和度会被降低。
这是一种自然现象,也是人眼看起来最真实、最舒服的现象。
举例说明,在三维软件中做三个颜色不同的面片。加上一盏灯光。
我们目前处于传统sRGB颜色模式下,当灯光强度被调高,面片的颜色竟然奇迹般地变“鲜艳”了,也就是饱和度更高了,这恰恰与现实世界看到的情况相反。
(此为blender软件存在的现象,在Houdini软件中经本人测试,调高灯光亮度后,面片的颜色没有变化,但正确的反应应该是饱和度降低。)
而使用了正确的颜色模式后,随着灯光强度增大,面片颜色的饱和度应该呈现降低的表现。这才是符合人眼视觉规律的。
▌解决方案:使用ACES模式取代sRGB
讲了这么多,那么不用sRGB用什么呢?——用ACES(Academy Color Encoding Specification )
ACES是美国电影艺术与科学学院创立的一套颜色统一化编码系统,旨在让高质量动态图片在任何设备上的效果都能保持一致,ACES支持的Dynamic Range高的吓人,达到了25+,比人眼所能看到的最大范围还要高。
下面是使用了ACES渲染的图片与传统sRGB的对比,左边是sRGB:
可以看到使用ACES的图片效果灯光非常自然真实,亮部也呈现出“Color desaturation”效果,与sRGB模式形成鲜明对比。
要想使用aces需要通过ocio(open color io)这一开源接口。官网:http://opencolorio.org/
目前,Nuke已经内置了aces1.0.3版本,只不过默认设置还是sRGB,需要手动切换,Blender新版已经默认集成了aces颜色,MAYA也内置了aces,也是需要手动修改,Houdini需要自行到索尼github官网下载aces包(https://github.com/imageworks/OpenColorIO-Configs)并指定OCIO环境变量……
使用aces工作流,整个CG流程都得做出改变,关于具体每一款软件的设置,这里暂时开个坑。先给出Houdini和Nuke的设置方法:
Houdini:
下载好上面网址的ocio配置文件后,指定环境变量OCIO=”config.ocio所在路径”即可。
Nuke:
在Project选项设置里,将颜色模式从nuke-default改为aces1.0.3即可。
(不过,这种设置方式在平时使用中是没什么问题,但当灯光设为极端强度例如10000时,会导致H里看到的颜色跟Nuke里不一样,这里暂时不清楚原因,有知道的大佬欢迎留言指教)