Best Visual

“感知CG,感触创意,感受艺术,感悟心灵”

----------我在这里等你们

关于LWF——线性工作流

1、什么是LWF?

LWF全称Linear Workflow,中文翻译为线性工作流。“工作流”在这里可以当作工作流程来理解。LWF就是一种通过调整图像Gamma值,来使得图像得到线性化显示的技术流程。而线性化的本意就是让图像得到正确的显示结果。设置LWF后会使图像明亮,这个明亮即是正确的显示结果,是线性化的结果。

线性流程是一个关于gamma如何工作的术语。要理解它,你需要知道什么是gamma,为什么它会存在以及如何控制它。

我们回到刚才的话题。先来看一个例子。


这是一个没有进行gamma矫正的图像例子。我们可以注意到灯光并没有充满于屋中,即使场景是用vray的GI渲染的。


我们在渲染完成以后后期调整图像的gamma,灯光变得正确充满了屋子。但是问题是这结果看起来有点曝光,而且颜色的色溢也计算错误。在地板上的颜色球,被赋予的是一个来自max的纯净的材质球,所以他们的颜色是正确的。然而,地面的材质的颜色和墙上的那副油画的颜色,是不正确的。饱和度和对比度都没有很好的被修正。


以正确的设置(线性工作流),颜色和灯光都是正确的。

用线性流程也有一些其他的优点,例如每通道信息都有32位。常规的图像(像jpg)每个通道(只有R,G,B通道)只有8位,虽然最后的输出结果也够好了,但是它并不包含足够的信息供后期处理使用。去看看电影,注意一下32位的图像时如何在过于曝光的地方保留更多信息的。你能发现在地板上的反射已经变得更好了。然而8位的图像并不“知道什么被隐藏”于白色的像素下,因此当曝光度降低的时候,它会变灰。而且,如果你在后期做一些景深和镜头效果(glare/bloom  眩光/散光),你会发现32位的图像会增加这些效果的质量。

现在,在我们开始研究gamma这个术语之前,你需要知道一些人类感知灯光世界的常识。我们所拥有的感知,并不是一个线性的方式的。换句话说,如果你手里拿着0.5千克的东西,再加上0.5千克,你可以很容易感到是双倍的重量,但是如果你拿着50千克的东西,再加上0.5千克的东西,你几乎感觉不到有什么不同。这种问题同样出现在听觉和视觉。

人类是怎样感知灯光的改变的


如你所看到的,我们可以很容易分辨出50瓦的和51瓦的灯泡的不同。但是即使在增加同样数量瓦数的情况下,我们也很难分辨出150瓦和151瓦灯泡的亮度的不同。

这条曲线描述了人类如何感知灯光的亮度。

 


因为我们在高亮度区域不能很好的区分亮度的不同,所以这就浪费了编码图像的一些信息,这些图像是那些在整个光谱中以同样数据密度录入的图像。(编码,就是,比如把一个图像存储成JPEG)换句话说,我们不需要在亮度区域保留同样的密度的信息,在暗部区域也是一样。事实上,如果你有一个线性编码图像,那么你至少应该需要每通道14位,而常规的jpg图像每通道却只有8位。最重要的是,比起人类的眼睛,你会有更多信息存在于亮部区域,从而能被区分出来-区分出那些被浪费的比特信息。

是的,那意味着jpeg是一个非线性编码格式。实际上,jpeg,以及几乎所有的8位的图像都是以同样的像人类感知灯光的曲线来进行编码。

这条曲线叫做gamma2.2.

三色图


你有注意过在max中,拾色器是如何从0到255的范围进行拾色的吗?这就叫做三色图。(色板)

这里解释了8位的图像是如何进行编码的:

注意色板在暗部区域的密度,和在亮部区域的宽度。这个结果显示在暗部区域有更多的信息,所以在这样的情况下,我们可以通过集中数据在暗部区域来利用人类对灯光的感知特点。

现在,在应用此编码以后,实际上此图片在后台发生的是,

这个图像变灰了。

像这样:


你会感觉到困惑并且想问:为什么不是所有8位的图片都变得很灰呢?那么,你现在应该了解一下在图像进行编码以后,发生了什么。

在过去的时候,当我们使用的都是CRT显示器的时候,我们有幸见到输入的图像和输出的图像分别是什么样的。实际上,这个亮度的规律,正好和人类的感知光线的规律是相反的。(当我们用的是进行过编码的图像)

注意亮度信息是怎样随着电压的增加而慢慢升高的,当它达到一定的电压值,就会突然上升。

如你所见,这条曲线正好和人类感知灯光的并且用来编码的曲线相反。

当gamma编码和CRT幂律函数在一起,中和以后整个结果应该是这样的:


像我们今天用的平板显示器,并没有当初老的CRT显示器那样的显示效应。但是为了得到同样的结果,今天的显示器也会预置一个gamma曲线,是为了得到正确的图像显示。换句话说,原则和之前是一样的。

那么,在你渲染的时候需要做些什么呢?

其实,十分简单。当要在3ds max中制作一个逼真的渲染的时候,用线性的方式去处理所有图像数据时非常关键的。因为它非常容易计算,而且也因为真实世界中并没有非线性的现象。那就意味着,当你在处理颜色、灯光、贴图,每件事需要做的事情的时候,都需要转换成线性空间。之所以叫线性,因为它不再是一条曲线了,而是直线,其被称作:gamma1.0。

 


让我们更进一步解释一下。当在非线性空间下计算的时候,会发生的是,在亮度上,他们在各个位置的比率是不一样的,于是实际输出亮度也就不匹配了。

 



如上面的插图所示,50%的地方的rgb值和实际输出的图像的图像并不匹配。如果要输出50%亮度的图像,实际上应该在图的22%的地方。这就是在非线性空间下计算,数学上出现问题的地方。

如果在线性空间下计算,那么他们的比率就匹配了,如图所示:

 



现在,你可能对gamma是如何工作的有了更好的理解了。那么就来看看如何在我们的整个工作流程中如何控制他们。

直接在你的显示器上看线性空间的东西,会显得有点发灰。是的,这是由于所有的东西都在后台以线性空间处理了,即给你的渲染和各种图层一个gamma2.2的矫正。换句话说,所有东西都是在gamma1的情况下计算的,只是你在gamma2.2的环境下观察他。

来看看3ds max是如何设置的。

首先,你要启用Gamma/LUT Correction.


进入菜单Customize/Preferences/Gamma and LUT;这是你首先要看的地方。

勾选Materials and Colors下的两个选项。你会发现色板和材质球都发灰了,(有时候需要刷新材质面板才能看到结果)他们看起来有点奇怪。但是别担心,去用就是了。这确保你的渲染时正确的。

display中的gamma设为2.2。这只会通过影响显示器来影响视窗、渲染结果的显示(并不会在后台实际改变图像的gamma)。

input gamma:告诉max它要以gamma2.2的矫正来处理贴图。除了HDRI图像,你的所有贴图(在大部分情况下)都会被gamma2.2矫正。这个接下来会详细说明。

output gamma:指定max如何保存他们的渲染结果。设置成1,是为了完整的保持线性的输出结果以在后期处理软件中更好的使用和处理。如果你在渲染以后不想进行线性工作流了,比如说你要保存一个jpg的图像,那么你需要把它设置成2.2。

点击下面的图像详细了解这个工作流程是如何进行的。马上你可能就会觉得有点混乱了,但是分析下面的东西会让你更好的了解到底发生了什么。


如果你用的是max自带的帧缓存,系统gamma设置将起作用,对你在最后看到的结果起作用。这只是看起来是这样的,但不意味着图像会被那么处理而保存。

如果你用的Vray的帧缓存,你需要启用sRGB按钮(在vray帧缓存窗口的下面),来观察最后的结果。

注意:如果你是用mental ray进行渲染的,你需要告诉mentalray以32位的方式进行图像显示。mentalray默认是16位的图像显示方式。

现在,制作一个你自己的场景,尝试一下这种方法。确保你的图像是以每通道32位的方式保存的。我推荐用exr格式,注意,ps并不能很好的处理这类的图像,但是大部分合成软件都可以。这里我用AE.


确保你的工程被设置为32bpc,确保AE能识别你的图像通道的所有信息。

当导入一个32位的图像或者任何exr图像,AE会自动识别它为线性图像,然后自动以线性方式去处理他们。如果你正确的对图像进行任何操作,它在AE中都将是正确的。及时这个图像还没有被gamma矫正,AE也可以立刻进行矫正。当你导出你的图像的时候,是否作为视频格式,AE在保存信息的时候,都会添加一个正确的gamma矫正。

别的任何东西都不用再设置。

如果你有不同的通道,比如反射层,你应该使用的叠加方式:Add。只要这个工程是在线性空间下,那么计算就是正确的。而Screen叠加模式,实际上是一个在处理非线性图像的时候,模拟正确数学算法的模式。

以上就这么多了。除非你使用的是vray。当用vray的时候,还会出现一个问题。vray在渲染的时候是自适应采样的,那意味着在较暗的地方,vray不会用太高的采样。这个方式叫做vray DMC采样(确定性蒙特卡洛采样)。问题在于,当你进行了线性工作流程的设置后,vray在判定明暗度区域的时候,不能得到正确的结果。这是因为在进行计算的时候,vray是在底层进行图像计算的。



这个图像说明了vray没有查找到正确信息的结果。你可以看到有相当多的噪点,即使是很亮的地方,即使有很高的采样。

这是因为vray正在处理的图像实际上是这样的,通过这个图像去采样。



为了修复这个问题,需要调整一些设置。

首先,你需要告诉vray是在线性空间中进行工作。vray在gamma设置方面有一些过时了,所以你不得不把下面的这个属性设置成2.2。

然后勾选Don’t affect colors (adaptation only)选项。


可以注意到,我并没有勾选Linear workflow选项。这是一个过时的方法,别管他了。


现在vray的DMC采样就正确了。


之前和之后的结果:




2、为什么原来的结果不正确?为什么要用LWF?

全局光渲染器在常规作图流程下得到的图像会比较暗(尤其是暗部)。而本来,这个图像是不应该这么暗的,不应该在我们作图调高灯光亮度时,亮处都几近曝光了场景的某些暗部还是亮不起来(即不应该明暗差距过大)。这个过暗问题,最主要的客观原因是因为显示器错误的显示了图像,使得本来不暗的图像,被显示器给显示暗了(也就是非线性化了)。所以我们要用LWF,通过调整Gamma,来让图像回到正确的线性化显示效果(即让它变亮),使得图像的明暗看起来更有真实感,更符合人眼视觉和现实中真正的光影感,而不是像原本那样的明暗差距过大。


3、为什么显示器会显示得过暗?什么是Gamma?为什么要设置2.2这个值?

为什么显示器显示出来的结果会过暗,这个问题涉及到电路电气知识,本人也不是太清楚。所以在这里简短引用下火星论坛凡子前辈的解释,希望可以大致明白一下:

首先,显示器的亮度变化,是因为它的输入电压发生变化。而输入电压的变化函数,和显示器的亮度变化关系不成正比,无法合理对应。所以导致了显示器显示失真,导致了不正确的显示结果(即暗的结果,非线性的结果)。而Gamma就是表示这个失真程度的参数。值越大,失真越大,图像也就越暗。而1则意味着图像不失真,会正常显示。大多数显示器的失真程度,即它的Gamma值,是2.2。所以我们在用LWF来校正图像失真时,才有了2.2这个参照数值。


4、LWF的设置流程怎么理解?

实现LWF的手段,说白了就是修改两个地方,即A+B:

A:修改max自身的Gamma

B:修改图像文件输入输出时的Gamma


这两个修改都在max“首选项”的“Gamma 和 LUT”选项卡中进行。但是要弄清楚:

A设置为2.2,并不是指修改图像文件的Gamma。而是告诉max,当前显示器的Gamma值是2.2,所以max显示图像时要按照这个前提来自我调整。当max得知显示器的Gamma是2.2时,它就让图像显示得亮些,以抵消显示器自身过暗的显示效果。A设置相当于是调整max自身全局Gamma环境的设置。

B设置为2.2,就是指调整图像文件自己的Gamma了(输入Gamma常对应于贴图文件调用,输出Gamma常对应于渲好图后保存。都是图像文件)。我们知道若仅设置了A,就相当于是max把自身Gamma环境给全局修改了,包括图像文件。而结果就是渲出来的图会整体过亮发白,显得不正常。这并不对。因为图像文件和显示器不一样,图像文件本身的Gamma就是正常的,是1,而不是显示器的非正常的2.2,因此不能当作和处理显示器的问题那样对待。所以要在输入输出的Gamma里设置2.2,让图片反过来显示得暗一些,来抵消仅设置A后导致的整体过亮。这样的话,最终图像就显得协调了。既让A设置发挥了作用,也借由B设置保证了图像文件不变亮,回复它本来应有的色彩效果。

B设置是全局设置,不能单独针对某个图像文件在输入或输出时来调整。如果个人有这个需要,可以把B设置恢复为1,然后在调用或保存图片时,单独从各自相应的对话框里设置Gamma为2.2。在调整图像输入方面时除此之外还有第3个方法,就是借助颜色校正插件。这个插件可以在鹏帆版主早先的LWF介绍贴中查询,这里就不细说了。如果使用的是max2009,max2009已经自带一种叫颜色修正的贴图类型,作用和该插件很相近,直接用它即可,就不用再单独安装插件了。至于LWF后产生的RGB值改变,或者适应改变后的效果,或者使用颜色校正插件都可以。


5、为什么还要在VRay的颜色贴图(Color mapping)卷展栏里设置2.2?它和max的Gamma设置有什么联系?

通常VRay在计算暗部角落区域的时候,因为那里出现的内容少,有效的像素少,或者说需要表现的细节少,所以VRay不会在那些地方过多的去采样和计算以节约时间。这就带来一个问题:如果仅仅通过上述max自身的Gamma设置,完成了LWF,校正了图的Gamma使之变亮,那图中那些原本偏暗的地方在被强行校正提亮后,就会因为暗部采样样本少而出现很多杂点。这就和在PS中把一个原本灰暗的图一下子调得太亮而导致暗部出现许多杂点的效果一样。要避免这个问题,来实现一个能保证质量的LWF流程,就需要在VRay的颜色贴图中,把曝光模式的Gamma设置为2.2。这样VRay就可以保证图中的暗处也有足够的采样计算了(因为VRay也知道了显示器的Gamma是2.2而自发做了调整)。它和max里上面提到A设置,意思是一样的。但因为唯一不同的是 VRay的有了暗部采样计算的过程,所以质量效果更好。


同时为了保证图的色彩还原真实度,和考虑到调节的便捷性,建议尽可能的只用线性曝光方式来渲染LWF图。


6、怎样区别对待这两处的Gamma?为什么LWF下要务必使用VRay的渲染窗口?

首先要说的是,max里的2.2,和VRay的2.2,如果两者都同时设置了的话,默认会得到一个错误的结果。因为这就相当于图在渲染出来后,Gamma被校正了两次,而变得过于白亮和不正常。而两者若只改其一,渲染后当然就可以得到对的效果,但仍然有问题:

只改max的2.2,也就是上述的A设置,会造成暗部采样不足, 导致产生很多杂点,图像质量不高;

只改VRay的2.2,max的Gamma全局环境没有得到调整,渲出来的材质效果和从材质编辑器里看到的效果不一样,给作图造成不便。(因为没有设置A,只设置了B,贴图会显非常暗。如果AB都不设置,则图像会受VRay的2.2影响而发白。)

为了能够保证质量和方便调节,我们当然是希望两者能够共存的。所以要达到合理化的LWF设置流程,最好的选择就是使用VRay的渲染窗口(也就是VR帧缓冲器/Frame buffer)。在之前的教程正文中也提到务必使用VRay的渲染窗口。因为max的全局Gamma设置正好是对这个东西不起作用的,它既可以正确支持 VRay的Gamma是2.2,又不会受到max中A设置的影响。两处地方同时设置为2.2也不会产生因二次校正后导致的图像发白的错误效果。这也就完美的解决了共存问题。但要说明的是,在VRay渲染窗口渲染完图像保存的时候,按Gamma值为1的原则保存即可。也就是说不用在max的Gamma输出设置中设置为2.2而是保持默认的1。否则还是会产生二次校正。

评论
热度 ( 3 )

© Best Visual | Powered by LOFTER