3DMAX VRay高级渲染实战:超现实效果与伽玛校正线性流程解析
在比较不同渲染器输出的效果图时,我们发现了一个有趣的现象。左侧的图是用错误的Gamma值计算得出的效果,而右侧的图则是在正确Gamma环境下调出的结果。VRay在预设情况下很容易计算出艳丽饱和的色调,这种色调与mental ray的细腻清色调有很大的差别。色调感的关键在于Gamma值,而不是渲染器本身。
伽玛(Gamma)是旧时代的产物。由于当时CRT屏幕输入一单位电压并不会产生等量的亮度(非线性),因此为了正确显示画面,人们特意产生了一个曲线关系(输入与输出),使得最终输出的图像为线性图像。即使是现代能够制造出线性反应的屏幕(例如液晶),这种现象仍然深深影响着图像处理,无论是后期合成调色还是3D渲染。
由于数位相机拍摄的图像一定会放在屏幕上观看,而数位相机发展的年代当时仍然是CRT,因此数位相机会自动在照片中内嵌Gamma信息,让照片能正常地显示在CRT屏幕上。然而,到了现代,这反而成为一个大问题,因为所有渲染引擎(VRay、mental ray、Finalrender、Maxwell等)都是以线性环境来计算物体与光的反应。因此,如果输入一个带有Gamma信息的贴图,会造成输出图像的错误(误差)甚至产生某种色彩调性的误解。
我们来看一下mental ray渲染出的效果图。
为了更好地理解这一概念,我们翻译了几篇不同来源的文章,希望借此机会把观念搞懂。因为线性工作流程(linear workflow)是未来的趋势。当浮点运算(16或32bit)的后制剪辑软件变成主流时,每个专业领域的人每天都会与LDR、HDR、Gamma这些东西搏斗。
Autodesk 3ds max 2010 Help中的说明图几乎涵盖了所有相关概念,关键在于在给算图器(renderer)图档之前,一定要把图档改为线性数据。这样,图档就能够在算图器这个黑盒子中以正确的数学式计算结果。在输出的时候,即使结果是正确的,如果没有调整到与屏幕相对的gamma值,那也会看起来是错误的图像!
伽玛校正(Gamma correction)是一个经常被误解的概念。简单来说,伽玛描述了相机或屏幕的非线性反应现象。当一个相机(模拟或数字)接收到两倍的光源时,相机并不会把这个数据存成两倍的RGB数值。这种现象称为伽玛,其中一个原因是显示器感光本身的问题,例如底片具有非线性的感光曲线,CRT屏幕也有同样问题:像素的亮度与输入的电压强度并不是呈现线性关系。
另一个原因是,人眼对于黑暗中的细节比明亮中的细节更敏感(人眼的感光曲线其实是对数曲线,称为Weber-Fechner定律),因此人眼视觉是以非线性的方式记录信号的。而现代液晶显示器(TFT)本身虽然没有先天上的伽玛问题,但是为了要迎合传统的工作流程,TFT屏幕会刻意模拟出伽玛的效果。
建议读者也可以阅读这篇关于线性色彩空间的文章,了解为何在处理HDRI数据时伽玛校正的重要性。如果你仍然不明白正确处理伽玛的重要性,请继续往下读。
伽玛的基本观念(Gamma 101)
所有的屏幕都有非线性的输出输入反应。这是故意的。
大多数的2D软件都会以线性的颜色模型来处理,所以它假定,255数值的亮度是128数值的两倍。但由于显示器对于信号的输出输入是非线性的,所以产生的亮度会是不正确的。事实上,大多数屏幕(gamma=2.2),如果你想要显示出255数值亮度的50%亮度的话,那你就必须要输入(0.5 ^(1/2.2)) 255 = 186的数值。如果你不考虑gamma的问题,输入128数值就只会产生大约(128/255)^ 2.2 = 22%的亮度。
数位相机基本上具有线性的输出入效果,但因为通常我们会在电脑屏幕上面看拍出来的照片,所以数位相机会故意在照片里面嵌入gamma。(所以,JPG格式是带有gamma的,但是RAW的格式是即线性资料,当你把RAW档转成JPG格式时就会产生非线性的照片了)
因此,如果你用2D软件去开你照片拍出的jpg图档时,您必须要把gamma补偿回来(去gamma)。
如果你的图片是在2D软件产生的(基本上这张图是线性的),当你把这张照片显示在带伽玛的屏幕你也要做gamma补偿。
更多关于伽玛
Gamma不是bug,它是一个功能,因为人的眼睛对光线的亮度具有非线性的感光反应。如果你每个颜色只有8 bit来记录颜色数据,很重要地利用这8 bit正确地重现人眼的感光效果很重要它必须要是非线性的编码方式。即使是新一点的屏幕仍然有伽玛:通常显卡会用8位来处理每种颜色避免色带问题,这8位必须每个强度看起来间距是等距的。屏幕的厂商有能力制造线性反应曲线的屏幕,但如果你用8位来显示图片,效果会很糟。
现今大多数电脑屏幕都以sRGB的标准来显示,也就是伽马2.2。
大多数数位相机也以sRGB纪录相片。如果是扫描进来的图或是合成图象就不会带有伽马2.2。
几乎所有的浮点纪录HDR数据是线性的,即与伽玛为1.0。
对于图片而言,“伽马”代表了强度是如何被记录的。换句话说:图档的gamma是为了要让图片在屏幕上能正确地显示出来。
有些图片会带有gamma的标签,但这是不可靠的,因为很多绘图软件会忽略这个标签。因此,要正确知道图档的gamma数值并不容易。如果您的屏幕有2.2的伽玛而显示的图片看起来很正常,那该图片可能本身就带有伽玛2.2。
3D算图引擎会假定光线是以线性的模式来记录。所以,你丢给算图引擎任何不是线性纪录的图档(带有gamma),严格说起来这个图档呈现出的效果是错误的(尽管它可能仍然好看)。
请注意,NVIDIA显卡驱动程序把gamma复杂性隐藏起来,当你在NVIDIA控制面板中看到:“1.0”,其实就代表是伽玛2.2。因此,“NVIDIA公司的γ= 1.0”,其实是标准的sRGB伽玛2.2
什么时候忽略gamma问题时会产生恐怖的错误
基本上当你要去编辑像素混合时就会有差。例如:
反锯齿,特别是在做wireframe渲染或是渲染有高对比的图像
缩小图片。所以,高对比度的图像,会产生更明显的错误
半透明物体
Gamma in 3ds Max
在Preferences菜单中可以控制伽玛。基本上有三个伽玛值可以调:
显示描述了您显示器的gamma通常,这个会设定成2.2。
当读取贴图时自动加载Gamma。这个功能能把图片线性化(译注:去gamma)。通常,这个有设定为2.2。注意:如果您打开一张图档,这张图档嵌入伽玛信息,3ds Max会套用固定的gamma数值,而不是用你图档的gamma数值!当然你可以改变这个设定当你开启图档的时候。
输出伽马会处理当你储存图档时。这数值应该是1.0,如果你要储存线性浮点图档格式。如果你只是希望这张图档再屏幕显示,那就用2.2吧。
当您打开一张bitmap图档而这张图档内嵌gamma,当你开启图档时你可以选择是要套用通用gamma数值还是要读取图档的gamma。有一点很重要的是bump或displacement贴图你gamma一定要设定为1.0因为这些是线性数据!
请注意,一些旧的3ds Max算法已调整为“好看”不伽玛校正,并因此将看起来很有趣,如果你正确的伽玛。
render farm会遇到的伽玛问题
当你的render slaves(算图奴工)不认识你送出的max场景档里面的gamma数据时算图就会出现问题所以你可以在每台算图奴工中设定respect the gamma state这样当读到max场景档时就会自动加载gamma。
在3ds Max 2009当中使用分布式算图Distributed Bucket Rendering(DBR)会有某个bug,他会强制加载固定的nput Gamma.这是因为分布式算图会自动启动mr Map Manager它会忽略“per bitmap”gamma的设定,所以当你在场景中有使用HDR档案HDR会受到gamma=2.2影响所以最后会产生太暗的图像目前解决的办法是将global input gamma设为1.0然后使用mr's“Utility Gamma/Gain”shader把贴图去gamma。
伽玛常被误解的观念
错误观念:我已经校正屏幕了-所以我不需要管gamma
错。当你校正完屏幕,通常代表你校准到标准的sRGB曲线,通常会是伽玛2.2。当你的屏幕做过校正,这表示你的所有图档都必须要做伽玛2.2的补偿
错误观念:我的数位相机会记录“线性”的照片
有可能你如果是用RAW档来存盘的话它是线性格式没错。但当你把RAW档转成JPG格式时就会自动套用gamma,通常这个数值是2.2
如果这篇文章对你有帮助,请留下一个赞和你的评论吧!谢谢你的支持!