【线性流程】Gamma correction and Linear workfkow 伽玛校正与线性工作流程

3 八月, 2014
258
0

vray_gammaVRay算出来的效果图

译者序:
上图左是用不正确的Gamma算出来的效果图,右图是在正确的Gamma环境调出的结果. VRay在预设的状况很容易算出艳丽饱和的色调这样的色调跟mental ray的细致的清色调有很大的差别. 其实色调感的关键是gamma, 反而不是渲染器本身.

伽玛(Gamma)是旧时代的产物由于当时CRT萤幕输入一单位电压并不会产生等量的亮度(非线性) 所以为了正确显示画面就刻意产生一个曲线关系(输入与输入) 让最终输出的影像为线性影像. 即使是现代能够制造出线性反应的萤幕(例如液晶) 这种现象仍然深深的影响影像处理不管是后至合成调色或是3D算图渲染.

过去因为数位相机拍摄的影像因为一定会放在萤幕上观看而数位相机发展的年代当时仍然是CRT 所以数位相机会自动在照片中内嵌Gamma的资讯让照片能正常地显示在CRT萤幕. 然而到现代这反而成为一个大问题因为所有渲染引擎VRay, mental ray, Finalrender, Maxwell,..都是以线性环境来计算物体与光的反应​​所以如果输入一个带有Gamma资讯的贴图会造成输出影像的错误(误差) 甚至产生某种色彩调性(比方说VRay似乎比mental ray更艳丽)的误解.

autodesk_mentalraymental ray算出来的效果图

这里翻译了几篇不同来源的文章, 可以把趁机会把观念搞懂因为线性工作流程(linear workflow)是未来的趋势. 当浮点运算(16或32bit)的后制剪辑软体变成主流时每个专业领域的人每天都会与LDR, HDR, Gamma这些东西搏斗.

gamma pipeline

这是Autodesk 3ds max 2010 Help里面的说明图这个流程几乎把所有观念都讲到了, 关键在于在你喂给算图器(renderer)图档之前一定要把图档改为线性资料这时图档就能够在算图器这个黑盒子中以正确的数学式计算结果最后在输出的时候即使结果是正确的你没有调整到跟萤幕相对的gamma值那也会看起来是错的影像!

以下文章翻译自MY MENTAL RAY网站

my mental ray

标题: Gamma

伽玛校正(Gamma correction)是一个经常被误解的观念。简单来说,伽玛描述了相机或萤幕的非线性反应的现象。当一个相机(模拟或数字)接收到两倍的光源时,相机并不会把这个资料存成两倍的RGB数值。有很多原因为什么相机的记录系统会有这种记录方式—-这种现象称为伽玛。其中一个原因是显示器感光本身的问题,例如底片具有非线性的感光曲线,另外CRT萤幕也有同样问题:像素的亮度跟输入的电压强度并不是呈现线性关系。

另外一个原因,因为人眼对于黑暗中的细节比明亮中的细节还要更敏感(人眼的感光曲线其实是对数曲线,称为Weber-Fechner定律)所以人眼视觉是以非线性的方式记录讯号的。而现代液晶显示器(TFT)本身虽然没有先天上的伽玛问题, 但是为了要迎合传统的工作流程TFT萤幕会刻意模拟出伽玛的效果。

建议读者也可以读读这篇关于线性色彩空间你就会知道位何在处理HDRI资料时伽玛校正的重要性。如果你仍然不明白正确处理伽玛是很重要的,请继续往下读。

伽玛的基本观念(Gamma 101)

1、所有的萤幕都有非线性的输出输入反应。这是故意的.
2、大多数的2D软体都会以线性的颜色模型来处理,所以它假定,255数值的亮度是128数值的两倍。但由于显示器对于讯号的输出输入是非线性的,所以产生的亮度会是不正确的。事实上,大多数萤幕(gamma=2.2),如果你想要显示出255数值亮度的50%亮度的话那你就必须要输入(0.5 ^(1/2.2))* 255 = 186的数值。如果你不考虑gamma的问题输入128数值就只会产生大约(128/255)^ 2.2 = 22%的亮度。
3、数位相机基本上具有线性的输出入效果,但因为通常我们会在电脑萤幕上面看拍出来的照片,所以数位相机会故意在照片里面嵌入gamma。 (所以。JPG格式是带有gamma的,但是RAW的格式是即线性资料,当你把RAW档转成JPG格式时就会产生非线性的照片了)
4、因此,如果你用2D软体去开你照片拍出的jpg图档时,您必须要把gamma补偿回来(去gamma)。
5、如果你的图片是在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吧。

3dsmax_gamma_dialog

 

当您打开一张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

以下文章翻译自MY MENTAL RAY网站  作者是: Zap Anderson (mental ray作者之一)

Zap Anderson

标题: 为何算图整个都过曝?

答案是:在你设定正确的色彩空间之前算出来的图很容易过曝

*、你之前设定过的场景都是错的.
*、你之前算过的图都是错的.
*、你以前输入的(材质 灯光)都是错的.

几年前,所有的材质shader都是用错误的色彩空间在做计算。常见的问题包括,当使用灯光衰减接近灯光的地方或过亮(因此有任会避免是用灯光衰减)在高光的边界的地方出现丑陋的过亮问题,就好像2 +2 = 10的效果)

由于这一点,很多人会用某些秘技来解决此问题。方法是把高光与diffuse做单纯的add混色(像photoshop那样),或只要diffuse强度。

所有这些技巧是错的,但最后的效果看启示真实的,即使这时候的gamma=1。

可悲的是,很多人就是因为这样反而看惯了不正确的gamma算出来的效果。

请看这两张CG图(一个是用Mentalray算的另外一个是用finalrender算的)。 Mentalray的效果是把tonemapper的作用法挥到极致(把过亮的部位去饱和度增加视觉美感),而finalrender算出来的是难看的gamma=1结果。

你可能会认为finalrender的效果才是正确的但事实并非如此。你可以看到finalrender把反射算的太亮产生不真实的感觉。

现在的问题是,当您转换到正确的色彩空间(finalrender或Mentalray),你输入的图档是错的出来的结果当然也是错的。

请看这篇关于XSI 解释的很清楚

重点是,当你在最后套用伽玛校正,这就表示你接下来做的每件事也要考虑到伽玛。

颜色不会因为某些错误而看起来过亮。颜色之所以会看起来过量是因为你把整个环境弄的过亮….或者因为你将gamma=1的颜色显示在gamma 2.2的萤幕所以结果反而让颜色不会过亮!

例如你看到所有未校正的颜色都是错的。他不会是最后会显示的颜色。

贴图也有一样的问题,如果你有一张gamma 1.0的贴图透过gamma 2.2的萤幕来看但是看起来却是正确的颜色为何呢?因为其实每张图片有史以来都会把伽玛数值烧到图片里面。所以这意味着…这些图片通通都错了(…在这样的历史原因下。我们可以理解为何要把伽玛数值烧到图片里面,因为这样的图片放到当时的CRT萤幕反而会让我们认为这张图片显示是正确的!)

是的,每一张再看到的数位相机拍出来的照片,你在网上看到,都是错的(在以上的观念下)。

错。所有的图片都错了。

那又是为什么这些图看起来是正确的呢? 因为你以错误的gamma去算图然后以错误的gamma萤幕来观看。因此,尽管你最终的贴图看起来是“正确的”,但是所有的计算式“光学的计算”过程都是错误的。

某些算图软体具有色彩校正的功能,当它读入图档的时候它会自动去gamma(un-gammaed)产生现性色彩空间的贴图每套算图引擎的这类功能不太一样很不幸的是某些的作用不正确某些有bug。

因此,最好的办法是自己做颜色校正的节点转换。

mia_exposure_simple就是这样的节点,它是一种简单tonemapper。 (它其实只具有亮度/对比度/伽马控制工具外加过亮区域的压缩功能避免clip现象;))

要知道,当你做了伽玛校正后你就会改变原本图片的红,绿,蓝通道的权重,这就相当于改变了颜色的饱和度。
所以你一开始的时候就必须输入正确的颜色。

过亮(Overbrights )
tonemappers的最重要工作就是要处理过亮问题。 mia_exposure_simple使用一个简单的压缩演算法,把颜色推到’门槛’以上,直到把它渐渐地clip成纯白,否则它会直接顶到纯白色变成难看的硬clip。

这个方法很重要,其实在底片,数位相机,CCD中也是这样处理地。

用老的shader,specular highlights很容易就爆光,看起来很难看由于hard-clipping色彩通道的关系。

这会让调颜色的人会把颜色条的太弱(相对于真实的物理强度),因为即使是最“弱”的数值相加起来也会很容易过曝为什么?因为这些颜色的加法是建立在非线性的色彩空间

请想想如果“2 +2”不等于“4”,而是“10”!

因此,如果“2 +2 = 10”,你希望效果看起来是“4”(因为你眼睛认为看起来正确),透过试误法你发现”2+0.5″的结果看起来像“4”,所以原本正确应该要用2,你改用0.5 然后你就对这样的结果满意。

但是当你把最后的结果,放到正确的tone operator(甚至只使用老式正确伽玛),它的结果还是会看起来像“2.5”而不是“4”。

这就是为什么很多人会投降说gamma真是个烂东西我以前没用gamma算图都不会有这种错误,干!放弃gamma!

而真正的错误是你的specular highlight数值太小的。

mia_material能够正确地处理这类问题的,你会发现,如果你在用它的时候没有使用伽玛校正或tonemapping,你会发现最后的highlights太亮。这是因为shader本身是正确的但是你观看它的方式是错的。

根据物理的算图是很困难的,主要是因为有很多根深蒂固错误流程还有软体本身的错误。

很多人误以为Maxwell是神奇的渲染器,而且远远优于mental ray,其实原因很简单这类渲染器一开始的时候就是以physical rendering的流程来写的,它并没有陈旧的软体包袱与错误的流程要烦恼。

Maxwell可以让所有的颜色正确显示,然后自动修正所有输入的图档,因为算图引擎确定最终的输出方式一定是以物理正确的色彩环境来显示,透过physical tone mapper来与萤幕观看!

以下文章翻译自3dlight.blogspot.com 作者是:Andrew Weidenhammer

标题: 线性工作流程介绍(Linear Workflow Introduction)

让我们开始谈谈线性色彩工作流程吧。

你可能已经知道什么是线性工作流程,但对于那些来不懂的以下是简短解释:
线性工作流程是因为你算图器本身就是以浮点(线性)空间来运算的。它会产生8-bit的输出,而这个图档会加入gamma 为了要在萤幕上显示。真是可惜阿。本来浮点的图片对于后制合成是很方便的却在输出的时候转成8-bit。

如果你不了解8-bit, 与32-bit(浮点)图片的差别,或是萤幕的gamma,那你可能要先爬文。有些好书我可以推荐你读。 The HDRI Handbook这本写的很不错,我高度推荐。网路上也有很多关于hdri的资料,hdri在计算机图形学中,就是利用线性工作流程的概念。了解hdri,你就会更了解线性工作流程。

你可能认为线性工作流程有什么大不了,因为你已经利用8-bit的方式算出好多年的美丽图档。其实只主要的差别,我想可以归结为以下:

1、物理正确性
你可以以真实的单位来创建场景,例如使用真实的烛光亮度。

2、真实光照
这说来话长,但在CG灯长久以来是以线性衰减来欺骗观众,或是根本就没有衰减。这是因为灯光的线性衰减并没有套用正确的伽玛。这就是为什么我们的CG前辈phong与blinn要去研究光线是如何反应的利用shader模拟光线效果。我们必须跨出历史进化到使用物理精确的材质。这就是为什么现在有这么多MR (architectural) shaders。它们都是针对物理精确线性流程来设计的。

3、后制的可调性大增
32位元浮点或16位元浮点有能力应付庞大的色彩和曝光调整。当你使用真实浮点的后制软体如Fusion,大多数的滤镜都能真实的产生效果。运动模糊效果,光晕,会表现的更真实与自然。

以下文章翻译自www.creativecrash.com 网站 作者是 throb

你有没有想过,为什么你的GI算图结果如此黑暗?那么,事实上,其实结果不是这么深。问题在于显示设备(CRT或LCD)及该软件是没有作出调整的伽玛是把我们的显示图像。这是伽玛明确要求sRGB。技术信息sRGB可在该网站上。

让我们看一下显示器会如何显示你输入的图档。这是非线性显示器。虚线是你输入的图档资料实线是萤幕根据输入的强度所输出的强度因为这条实线是直线所以这个萤幕是正确地显示。

要知道这个萤幕校正并不是跟底片有关。事实上,这跟底片没什么关系。它本质上是为了要校正萤幕。

好了,现在我们来看怎样解决这个问题。是的,这是一个问题:)嗯,朋友,我们只要再套用另外一条反向的曲线,就可以把原本的曲线变成直线了(线性化)。你看到这次实线因为我们套用的曲线而变直了。

再解释一下,… sRGB是绘图软体对萤幕的校正。数位相机会对你的照片套用sRGB 但是你不会察觉这件事. 所以当你利用此照片在真正的线性工作环境中时事实上你的操作可能会比真实世界的光线反应还要更剧烈一点。我用以下的渐层图来说明

这是一张渐层图图中是个0到1的数值共有32阶。请注意0​​.5数值正好在中间。这张是你输入到萤幕的图档。这是一个线性图档!

这是你的显示器显示出来的样子。在0.5的位置显然不是在中间了。这代表萤幕是非线性的。

这是校正后的影像没错看起来比较亮了但是这个校正让你播放在非线性的萤幕上时图片显示的是线性的以上说明希望读者能明白

我们再举一个例子。

这里有两张图。再中间的灰色具有0.18的数值(中间灰色点)。左边是以sRGB编码右边透过sRGB萤幕校正的影像。这会让灰色变成.46的数值。

Gamma编码的图形会导致灰阶的细节消失

线性图形会保有细节
让我们将以上观念以3D软体进行实战吧:3DS Max 7.0与VRay的1.46

以上是我们算第一张的结果:

现在,我们必须将这张图线性化,如果我们希望画面更逼真。

首先到Customize -> Preferences -> Gamma tab 将数值改变

这样我们才能在材质编辑器看到正确数值。

Brazil的用户,你就快完成了接下一步吧。
Mental Ray的用户 到这里算是完成了!你本来就是用线性方法在算图。
Scanline render用户-到这里算是完成了。以后的操作都是线性流程了。

转载:hammerbchen.blogspot.com
翻译:Hammer Chen