VR高级-LWF线性工作流_第1页
VR高级-LWF线性工作流_第2页
VR高级-LWF线性工作流_第3页
VR高级-LWF线性工作流_第4页
VR高级-LWF线性工作流_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Gamma的概念在我们的CG工作中很少得到重视和深入的认识,而实际上这个环节又极具 意义,因为我们的工作结果总是有太多的不一样,得不到标准化的统一,所以这是我写这篇 文章的主要原因,为此,我也放下了 Vray全面详解的写作进度,转而把精力放在了 LWF 的研究中来,意在和大家共同探讨在线性工作空间进行制作的可行性和其意义,文中谈到 Gamma的概念是比较抽象和相对化的,有很多相对的理论,需要读者仔细思考,当然,由 于本人水平有限,错误之处在所难免,欢迎批评指正。第一节颜色的真实性我们应该感谢上帝给予了我们生活的世界众多美丽的色彩,并让我们可以用自己的肉眼以极 其真实的体验来感觉它们,当然,我们

2、并不满足于此,对于从事CG工作的我们而言,把这 些丰富的色彩真实地还原到计算机图像中才是我们关心的。然而,把世界中尽乎无穷的颜色 表现在计算机世界中却并不简单。首先,物质世界的颜色是无穷连续变化的,是一个线性量,但人的眼睛对亮度的感觉却并非 呈线性分布,而是呈指数分布的。人眼只是对亮度的比率敏感,而并非对亮度本身敏感,我 们观察到的亮度从0.10到0.11之间的差别与0.50到0.55之间的差别是一样的。这种非线性 在日常生活中很容易感觉,比如你把灯泡功率从20W调到80W再调到140W,你会发现20W 到80W之间亮度的增加比后一次调节来得更大。所以,当真实世界中线性无穷的颜色量到 达人眼时

3、,它们实际上被人眼感觉的非线性做了一次“校正”,只是这种“校正”从某种意义上 说是错误的背离真实的,但我们自身无法避免,这是人类眼睛的特质,没有办法,所以我们 只能对源色彩向相反的方向进行指数校正(也就是让颜色不呈线性分布,而呈指数分布), 来让我们觉得亮度分布均匀。上面的论述所提出的校正,基于这样一个事实,我们真实的源是真实世界中的颜色,这是标 准,我们所做的校正,是让眼睛看到的东西尽可能贴尽真实世界。然而,把情况放到实际CG应用中来,就有更多变化:一、没有人关心也没有人知道源世界真实颜色到底应该是什么样,我们所提及的真实颜色, 都是在眼睛看到以后的结果,所以,我们在CG制作中,真实的标准是

4、眼睛看到真实世界后 的结果。二、CG制作中颜色的变化和失真发生在多个环节:从真实世界采样信息到计算机过程中的失真从计算机软件中制作生成的格式转换中的失真从计算机数字化图像到物理显示设备转换中的失真 所以我们的校正也要针对不同情况,考虑的问题更多。在一般情况下,CG制作主要分为两种情况,一种是完全的数字化从无到有的创作过程(比 如你在三维软件中从无到有建模,打灯光,渲染输出),另一种需要对现实世界采集信息并 加工处理(比如你用一台单反胶片或数码相机拍下一张照片并导入到计算机中来进行处理, 此后有可能拿到三维软件中作为一张贴图来使用),就第一种情况而言,因为不需要从现实 环境中采样数据,所以我只需

5、考虑失真的后两种情况,即制作生成的格式转换中的失真和数 字化图像和物理显示设备之间的转换失真。第二节Gamma和Gamma的问题设想一下,当我们开始用电脑制作某CG内容时,我们首先是通过电脑显示器来与应用程序 之间发生交互和信息交换的,如果显示器本身不能很好的还原数字化内容本身的真实颜色, 也不能准确显示标准的颜色,那么这就意味着,只要你开始选择一个颜色,就是错误的。然 后接下来不管怎么样都会是错误的。这样,我们就得明白一个问题,显示器为什么会失真,我们如何校正?拿CRT显示器来说,显示器的亮度变化是因为其输入电压发生变化,但是由于输入电压的 变化函数和亮度的变化关系是不成正比的,这就存在了失

6、真。说得通俗点就是,当显示器要表现一数字化图像内容时,假如我们这时把这个内容看成是一 个线性连续量,这时显示器的电压变化就不能很好的表现这个连续量,就出现了失真。换句 话说,我们可以这样理解,显示器在显示那个数字化内容时,做了一个不正确的校正,非常 巧合的,这个校正的函数关系也是指数关系。工业上我们一般把显示器的这种错误校正或者 说失真度,用一个参数来衡量,那就是Gamma。如果我们把显示设备要显示的原始数据称之为输入(Input),把原始数据通过显示设备后显示 出来的结果称之为(Output),那么它们之间的关系实际就是:Output=InputGamma不难发现,这就是一个指数关系,而输出

7、的结果,实际上就是给输入做了一个gamma值大 小的指数级映射变化,Gamma,也就是衡量了这个指数变化的程度,当Gamma为1时,也 就是Output=Input,因此,如果Gamma值为1就意味着不发生改变,或不校正,不失真, 输入和输出相等,而Gamma值越大时,失真也就越大。事实上,不同的CRT显示器其失真度都不相同,也就是Gamma值都不尽相同,但一般来说 都是2.2-2.5这个范围,假如一个显示器的gamma值为2.5,这意味着什么呢,就是一个线 性连续图像在显示时会被做一个gamma2.5的错误校正,或一个gamma2.5的失真,线性分 布的图像会变成指数分布的图像,就像下面这个

8、例子,当我们输出以下这个黑白渐变:(原始黑白渐变图像)由于CRT显示器的gamma2.5特性,图像将变成下图所示情况:可见,显示器的这种错误“校正”使得中性灰在指数关系下变黑了,总体的表现就是暗部增加, 图像整体变暗,暗部细节丢失。那么,知道了错误发生的症结,我们该如何校正这一错误呢?由于显示器的Gamma是显示 器的固有特性,我们是无法改变的,所以,思路应该是这样,既然显示器做了一个gamma2.5 的改变,而我们需要的是让Gamma保持为1,这样输出结果就是无失真的,那么我们只要 再显示器输出过程之前多做一次Gamma校正,让最终的Gamma值为1就可以了。也就是: Display_Gam

9、ma=CRT Gamma * 校正 Gamma=1以CRT Gamma为2.5为例,那就是要做一个Gamma0.4的校正,这样Display_Gamma=2.5*0.4=1在计算机系统中,在显示器之前做的这个Gamma校正事实上由显卡完成,但问题在于,上 述的例子是我们事先知道显示器CRT_Gamma为2.5的情况下,我们用一个Gamma0.4来做 校正,但显卡并不知道我们的显示器实际是什么Gamma值,更坏的情况是,也许做为用户 的我们,自己都不知道自己的显示器CRT_Gamma为何值。操作系统怎么解决这个问题呢?它提供了一个LUT系统(Look UP Table),也就是查色表, 当我们知

10、道自己的显示器的CRT_Gamma值后,告诉LUT,现在这台显示器的Gamma值为 多少,LUT得知后,调用对应的Gamma校正函数,用合适的Gamma值来控制显卡输出校 正后的电频信息给显示器,所以,我们也把这个校正Gamma数值称之为LUT_Gamma。又 由于这是系统内部做的校正,我们又称它为系统Gamma(System_Gamma)。但问题还没得到完全解决,那就是,如果我不知道自己的显示器CRT_Gamma值呢?事实上, 这才是问题的关键,我们需要大概地测试一下自己的显示器,在没有专业仪器的帮助下,这 种测试只可能是大概的,我这里提供一个简易的办法:根据上图,调节显示器亮度使得你能看到

11、尽可能多的暗灰色块,但要同时保持背景为纯黑, 并且以保证背景为纯黑为最基本前提,设置好以后,再看下图: 接着,你离显示器一定距离(大概三米),然后把眼睛眯成一条缝,看看上图中右边哪个小灰 度条和左边的长条最能容到一起,那么,你们显示器CRT_Gamma基本上就是表上的数值了。 因为是大概的测试方法,所以难免有误差,这里只是希望能力求精准。现在大多数显示器以CRT_Gamma为2.2居多,而以前一些老显示器可能以2.5居多第三节 将Gamma的概念细化在上一节里,我们了解了用CRT显示器显示一个线性图像的问题,我们也了解了什么是 CRT_Gamma以及LUT_Gamma,但我在第一节中就提到过,

12、图像失真还可能发生在文件格 式的储存和调用以及格式的转换上,在这一节,我们就将讨论这一问题。当我们用一部数码单反相机拍下一张自然风景照片,并且存储为RAW格式的图像文件时, 问题还不是很大,因为RAW是浮点格式的高精度存储格式,我们可以认为它近似线性连续 地记录下了我们的原始数据,但一旦你将它转换为一些非浮点低精度图像格式,如JPG、 BMP、TIFF等格式时,因为这些格式是以整数来记录数据的,这样就造成数据被离散化, 不再那么连续,导致失真。并且,另一个问题是,线性的RAW文件格式中的数据被映射在0-255这样的整数范围时, 是否也是线性分布呢?这可不一定,所以在这里引入一个新的概念,编码

13、Gamma,也就是 Encode_Gamma,如果系统或软件在写入某文件格式时,将原有的线性数据也按线性映射在 整数范围内,那么它的Encode_Gamma就是1,即不改变,这时数据的失真仅仅是因为近似 无限连续的线性数据变成了离散化的线性数据。如果写入时将原有的线性数据按指数分布映 射在整数范转内时,Encode_Gamma就不为1 了,此时Encode_Gamma代表的就是这个指 数。反应的就是数据存进文件后有了怎样程度的失真。当然,有写就有读,既然有编码Gamma 自然就有解码Gamma,也就是Decode_Gamma,当一个软件打开并读取一个图像文件时,它 是否对这个图像数据做变换处理

14、,这个度是好多,就由Decode_Gamma来决定,如果Decode_Gamma为1,就是不改变,不校正,如果不为1,就表示要改变或校正,它的数值 决定了做多大程度和什么样的改变。绝大多数情况下Encode_Gamma和Decode_Gamma都是为1的,比如,默认的操作系统中 IE浏览器的Decode_Gamma就为1,ACDsee看图软件在没设置的默认情况下, Decode_Gamma也为1,所以用它们两个去看一张标准的线性图片是会有问题的,因为显示 器的CRT_Gamma是2.2-2.5左右,而默认情况下LUT_Gamma为1 ,所以我们实际看到的 图像的Gamma也就是CRT_Gamm

15、a,是非线性的,这就发生了错误。而如果你用Adobe photoshop去打开这张图片往往和那两个软件中看到的不一样,并且结果是对的,因为Adobe photoshop默认是进行色彩管理的,就是在软件使用过程中调用了 LUT查色表并让 LUT_Gamma不为1,所以这时就做了对的校正处理。事实上,我们不难在应用软件中发 现Encode_Gamma和 Decode_Gamma的应用身影,比如在 MAX 的优先设置面板中,在 GAMMA子选项里,有这么一组参数,如下图:这个里面的InputGamma呢,指的是当MAX调入任何一张图片格式时,做什么样的Gamma 校正,这个操作显然是读操作,假如In

16、putGamma为2.2,那么当MAX调入一张贴图时, 这个贴图就会在调入内存时被事先校正,MAX通过把InputGamma,也就是2.2这个值告诉 LUT查色表,查色表接着告诉MAX应该对贴图进行了一个Decode_Gamma为0.4545的校 正,这里是很容易产生混淆的一个概念,很多人会以为InputGamma取值为2.2时,是MAX 对文件调入内存之前做Gamma2.2的校正,这是错误的,当InputGamma取值为1时,LUT 查色表告诉MAX需要对其做Decode_Gamma为1的校正,也就是不校正,不发生改变。 反过来,再去理解OutputGamma就和上面的情况类似了,只不过它的

17、校正发生在即将写入 文件数据之前,是写入操作时发生的校正,并且通过将OutputGamma值传递给LUT告诉 MAX该用什么样的Encode_Gamma作校正。这时,你可能要问,是不是总是应该保持Encode_Gamma和Decode_Gamma为1呢,这样 反正就保持原样了,岂不省事?这就要具体情况具体分析了。如果你用单反数码相机拍照存成了 RAW文件,并转换成诸如JPG、TIFF、BMP这样的格 式,这时,就会有一个问题,因为数码相机感光器的特性,从相机里输出的文件,比如RAW 都是做过了一个Gamma0.45校正的,这时,往往在写入文件时编码就应该做一个 Encode_Gamma2.2的

18、校正才能得到正确结果,或是在读文件时做一个Decode_Gamma为2.2 的校正才能正确显示或使用这个图像,所以不同的情况是不一样的,如果图像本身是从计算 机内部从无到有创建的,那么保持Encode_Gamma和Decode_Gamma为1是一个比较好的 作法。通常,我们把一个文件自身呈现的Gamma特性称之为File_Gamma,如果文件由外界摄取 自计算机,那么:File_Gamma=Device_Gamma * Encode_Gamma(其中,Device_Gamma是指设备的Gamma,如果是数码单反,通常是0.45) 如果文件由计算机本身凭空创造,那么,就不存在设备,就有:File

19、_Gamma=Encode_Gamma然而,为了保证整个工作流程的线性化,所以我们应时时保证文件自身的Gamma为1,也 就是 File_Gamma 为 1。事实上,MAX在打开和存储图像文件时,都具备非常详细的Gamma选项供用户控制,如 下图:其中第一个选项Use images own gamma就是使用文件自己的文件Gamma,不对其作任何改变 的打开。第二个选项Use system default gamma,就是说根据先前MAX优先设置面版里的input或 output里的Gamma值对文件Gamma相应进行Encode_Gamma或Decode_Gamma的校正。 第三个选项Ove

20、rride ,是说用户指定一个Gamma值,对这个图像进行一次这个 Override_Gamma值的校正,注意,这次就和上面讲到的优选设置面板里的OutputGamma 和InputGamma情况不一样,这次是直接做一个Override_Gamma取值的校正,你给2.2,就 做Gamma2.2的校正,结果是图像变暗,给0.45,就做Gamma0.45的校正,结果是图像提 亮,它是不会去查什么LUT查色表的,这就是实实在在做校正,要加以区别。那么,通过这三个选项,我们就能很好地控制素材的文件Gamma,做到调进来的图是否线 性化,在线性工作流程下,有一个准则,如果图像文件本身的文件Gamma不为

21、1,那么我 们就要通过设置这些参数来让它调入后为1,如果图像文件本身的文件Gamma已经为1,那 么我们可以选择第一项来使用文件自己的Gamma设置就可以了,这样,你的图像至始至终 都是在线性空间下工作的。这点在整个流程中也至关重要,因为校正是不可以多作的,校正 多做了就是错误的结果。如果某张图像文件由数码相机拍摄并转为JPG或其它整数结构格 式,这时,它的文件Gamma事实上不为1,前面我提到了,由于摄像机感光器特性,加上 默认情况下软件或系统的Encode_Gamma为1,所以文件Gamma就是Camera_Gamma也就 是大约0.4545,那么当我们把这个文件调入到MAX里来做贴图时,

22、事实上该文件的数据就 是非线性的,因为文件Gamma不为1嘛,我们要让它变成1,这里我们就可以使用第三个 选项,将Override_Gamma设为2.2,这样就对它做了一个Gamma2.2的校正,基本就线性 化了。那么,讲到这里,我想Gamma的概念在我们的脑袋里应该有了不同的定义,在不同的阶段 不同的时候Gamma都有其特殊的意义,最后呢,我为这个小节做个总结,列出一些我在文 中提到过的概念:Camera_Gamma摄像机Gamma,因为摄像机感光器的特性,拍下来的图像相当于会自动进 行一次Gamma校正,其值一般约为0.4545Encode_Gamma编码Gamma,在文件形成,数据写入时

23、,对数据变换分布所相当于造成的 Gamma校正。Decode_Gamma解码Gamma,在文件调用至内存时,数据按新的分布方式读出所相当于造 成的Gamma校正。LUT_Gamma系统Gamma或查色表校正Gamma,作用于显卡层面的帧缓冲,对其进行 Gamma校正以适应设备输出。CRT_Gamma显示器自身电压特性相当于造成的Gamma校正。不可修正,一般为2.2或2.5。 根据以上概念为基础,我们还加入一些附加概念:File_Gamma图像文件相对于要反应的原始数据的Gamma特性,是文件自身的Gamma特性, 表征了数据在存储为文件后的改动特性。如果文件来源于外部设备如摄像机,File_

24、Gamma=Camera_Gamma * Encode_Gamma如果文件来源于计算机内部创作File_Gamma=Encode_Gamma特殊地,如果文件在写入之前有软件功能上的人为Gamma校正,如Vray帧缓冲的Gamma 曲线调节,那么File_Gamma=Calibration_Gamma * Encode_Gamma (其中 Calibration 是校正的意思) Display_Gamma显示输出Gamma,表征显示设备最终显示的结果相对于要显示数据的改变 特性以 CRT 显示器为例:Display_Gamma=LUT_Gamma * CRT_GammaView_Gamma全局G

25、amma,是所有Gamma校正和变换结果的总和,通常用来表征我们最 后看到一幅图像的样子时它相对于原始是什么样的改变特性,事实上,在我们提及的线性 化流程里,我们的目标,就是要让View_Gamma为1,如果考虑到人眼自身还有一个Gamma 特性的变换,我们也可以让View_Gamma最后为1.5。而 View_Gamma=File_Gamma * Display_Gamma所以我们的线性工作流程,实际上包括两个方面的工作:第一、保证每一个用到的文件,其File_Gamma是1第二、我们在操作软件之前通过显示设备所看到的图像,本身应该是线性的,即 Display_Gamma为1只要保证了这两点

26、,我们的线性工作流就是成功,和高效的。第四节MAX中的线性工作流程之所以这一节的标题命名为MAX中的线性工作流程,是因为仅仅在MAX中实现线性工作 环境这只是一个局部的概念,一个小概念,真正广义的线性工作流程可能要涉及CG制作的 全环节,包括我前面讲的从外界引入素材,但是在本节,我们仅仅讨论MAX的情况:从第三节的总结中,我们已经知道了,我们需要保证Display_Gamma和File_Gamma在MAX 这个环节都要为1,File_Gamma保持为1我在第三节中基本已做了较详细的讲述,这里就 省去不谈了,主要看看Display_Gamma,由于操作系统在默认情况下,对GUI应用程序界 面是不

27、做校正的,任由显示器CRT_Gamma输出,这就导致Display_Gamma不为1,我们 可以在MAX中设置,让显卡对MAX中的应用程序界面进行LUT_Gamma校正,这样就能 保证我们在在颜色拾取面板和材质面板中选择正确的线性颜色,并且保证正确的中性灰,来 看下图:如图所示,打开MAX优先设置面板中的Gamma子页,勾选使用LUT_Gamma,这里,你 可以看到一个Gamma参数,这个参数不是告诉MAX要做多少的Gamma校正,而是告诉 MAX,你的显示器的CRT_Gamma值,如果你的显示器Gamma值为2.2,你就输入2.2,为 2.5你就输入2.5,这个值最终将告诉LUT查色表来用什

28、么LUT_Gamma来做校正,如果你 不确定,或认为自己的显示器没校准得非常好,不用担心,MAX提供了一个简单的校准器, 如图中的外框和内框两个灰色区域,你可以边调节Gamma数值,回车确定后眯着眼观察内 框灰度和外框是否容合到一起,如果基本能容在一起,那就可以了。接着,非常重要的一步 是勾选 Affect Color Selectors 和 Affect Material Editor,这样,LUT_Gamma 校正将作用于 MAX的拾色器等有帧缓冲的界面,这样你对颜色的选择就比较准确了,然后呢,保持input gamma和output gamma都为1,因为即便我们想对文件的写入读出进行G

29、amma调整,也可 以在写入和打开时单独用选项控制,不必动用这里的宏观控制。设置完成后,基本就完成了 MAX里的线性工作环境设置,但此时要注意,如果你使用MAX 自己的帧缓冲渲染输出,那么就不应该再对其进行任何Gamma校正,因为在优先设置面板 里你已经开启了 LUT_Gamma校正,它对MAX的帧缓冲是起作用的,渲染出来的图是线性 的,是校正后的。如果你使用VR的帧缓冲,因为MAX优先设置面板里的LUT_gamma校 正对VR的帧缓冲不起作用,所以渲染出的结果,是直接未校正就显示在显示器上的,是不 准确的,这时你就需要通过VR的Gamma校正功能来校正,具体如下图所示:其实这里之所以要在使用VR的帧缓冲情况下单独再用VR的Gamma校正,是因为MAX 的设置对VR是不起作用的,所以对于LUT_Gamma校正我们要多做一次,仅此而已。并且, VR的Gamma校正里的Ga

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论