因为我们在高亮度区域不能很好的区分亮度的不同,所以这就浪费了编码图像的一些信息,这些图像是那些在整个光谱中以同样数据密度录入的图像。(编码,就是,比如把一个图像存储成JPEG)换句话说,我们不需要在亮度区域保留同样的密度的信息,在暗部区域也是一样。事实上,如果你有一个线性编码图像,那么你至少应该需要每通道14位,而常规的jpg图像每通道却只有8位。最重要的是,比起人类的眼睛,你会有更多信息存在于亮部区域,从而能被区分出来-区分出那些被浪费的比特信息。
是的,那意味着jpeg是一个非线性编码格式。实际上,jpeg,以及几乎所有的8位的图像都是以同样的像人类感知灯光的曲线来进行编码
三色图
你有注意过在 3ds 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:告诉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问题和线性工作流程问题一直以来都是讨论的热点问题。如果我在某些方面有些不对的地方,欢迎指正。这些东西都是我自己学习研究搜索得到的。
希望这些东西正是你所需要的,就到这吧,谢谢。
3D教程到这里就结束了
专题推荐:吊灯3d模型、3dmax2009中文版下载、3d玻璃材质
|