为什么要用线性工作流程?
很多3D设计师会觉得这种观念十分令人困惑。因此他们觉得这没有太多意义,但是请相信我,这很有必要。
在线性工作流程下,灯光的计算和从渲染设置到后期处理的整个颜色的处理过程,都是正确的。如果你旨在的使你的渲染更具真实度,那么你就需要这么做。
这是一个没有进行gamma矫正的图像例子。我们可以注意到灯光并没有充满于屋中,即使场景是用vray的GI渲染的。
我们在渲染完成以后后期调整图像的gamma,灯光变得正确充满了屋子。但是问题是这结果看起来有点曝光,而且颜色的色溢也计算错误。在地板上的颜色球,被赋予的是一个来自3ds Max的纯净的材质球,所以他们的颜色是正确的。然而,地面的材质的颜色和墙上的那副油画的颜色,是不正确的。饱和度和对比度都没有很好的被修正。
以正确的设置(线性工作流),颜色和灯光都是正确的。
[flash]http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=100086984_1625064984/s.swf[/flash]
用线性流程也有一些其他的优点,例如每通道信息都有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位的图像都是以同样的像人类感知灯光的曲线来进行编码
三色图
你有注意过在3ds Max中,拾色器是如何从0到255的范围进行拾色的吗?这就叫做三色图。(色板)
这里解释了8位的图像是如何进行编码的:
[flash]http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=100089052_1625064984/s.swf[/flash]
注意色板在暗部区域的密度,和在亮部区域的宽度。这个结果显示在暗部区域有更多的信息,所以在这样的情况下,我们可以通过集中数据在暗部区域来利用人类对灯光的感知特点。
现在,在应用此编码以后,实际上此图片在后台发生的是,这个图像变灰了。像这样:
你会感觉到困惑并且想问:为什么不是所有8位的图片都变得很灰呢?那么,你现在应该了解一下在图像进行编码以后,发生了什么。
在过去的时候,当我们使用的都是CRT显示器的时候,我们有幸见到输入的图像和输出的图像分别是什么样的。实际上,这个亮度的规律,正好和人类的感知光线的规律是相反的。(当我们用的是进行过编码的图像)
[flash]http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=100089731_1625064984/s.swf[/flash]
注意亮度信息是怎样随着电压的增加而慢慢升高的,当它达到一定的电压值,就会突然上升。
如你所见,这条曲线正好和人类感知灯光的并且用来编码的曲线相反。
当gamma编码和CRT幂律函数在一起,中和以后整个结果应该是这样的:
[flash]http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=100087802_1625064984/s.swf[/flash]
像我们今天用的平板显示器,并没有当初老的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:告诉3ds Max它要以gamma2.2的矫正来处理贴图。除了HDRI图像,你的所有贴图(在大部分情况下)都会被gamma2.2矫正。这个接下来会详细说明。
output gamma:指定3ds Max如何保存他们的渲染结果。设置成1,是为了完整的保持线性的输出结果以在后期处理软件中更好的使用和处理。如果你在渲染以后不想进行线性工作流了,比如说你要保存一个jpg的图像,那么你需要把它设置成2.2。
点击下面的图像详细了解这个工作流程是如何进行的。马上你可能就会觉得有点混乱了,但是分析下面的东西会让你更好的了解到底发生了什么。
如果你用的是3ds 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采样就正确了。
之前和之后的结果:
很好,gamma问题和线性工作流程问题一直以来都是讨论的热点问题。如果我在某些方面有些不对的地方,欢迎指正。这些东西都是我自己学习研究搜索得到的。
希望这些东西正是你所需要的,就到这吧,谢谢。