2008年10月25日星期六

Linear Workflow (线性工作流程)

Linear Workflow (线性工作流程)


1, 什么是线性工作流程?

线性工作流程确切的说是匹配软件的线性工作流程。这种流程在近几年被广泛应用于电影广告等高端项目。国外大型工作室几乎都是基于这种流程。实际上我们需要物理上正确的计算,那只能是基于线性工作流程。不幸的是,我们以前都不是基于这种流程。就是说理论上我们以前和现在几乎所有的maya渲染,后期制作都是基于错误的计算方式。能够接受它是因为我们在错误的基础上让它看起来“好看”(其实并不正确)。


那么具体什么是线性工作流程呢?线性工作流程就是软件在计算时,所有参与计算的数据都是基于线性的。我们使用的几乎所有图像处理软件都是基于线性的计算方式。就是说 1+1=2 2*2=4 128+128=256。我们使用的maya, maxnukeshakefusionphotoshopmentalray, maxwell都是这种计算方式。这种流程的正确的前提是它在计算前所有的素材,条件,灯光都是线性数据,1代表的是15代表的是5。但是我们现在的流程是非线性的(错误的)。主要原因:

  1. 输入的是错的。(素材是非线性的sRGB空间。)

  2. 操作是错的。(基于错误色彩空间进行测试maya操作(打光,渲染,输出)。输出的图片是线性但在sRGB空间下观看。)

    1. 2 + 2 = 10 (灯光师的感觉,灯光易爆)

    2. 不能应用2次方衰减

    3. Mentalray的物理渲染

    4. 取色器。

    5. 所有对材质的调整

  3. 输出是错的。(输出的是线性空间下的8bit 16bit,但不进行调整)


2,基本概念

如果我们要充分理解线性工作流程首先需要弄清几个概念。LinearsRGB, gammawindous 色彩管理,显示器部分原理,眼睛的部分感官特点,8bit, 16bit,32bit.


3,先从显示器说起,我们常说“CRT显示器的gamma2.2,苹果是1.8”这种说法是不正确的。

什么是gammagamma是一个非常模糊和不精确,被乱用的一个概念,现在其已经几乎被禁止使用的一个单位。它最早是用来表述胶片曝光的log曲线和胶片线形密度的关系。后来被各种工业部门用来表述类似的关系,数学上大概可以表示为:

y = xr2.2







曲线的形式





我们常用的CRT显示器,不论他是苹果的还是什么的出场的时候本身的物理gamma值都是2.5。主要原因是撞击显示器荧光粉的电子强对于电压的反应不是线形。大概可以用gamma 2.3 – gamma2.5来表示。而如果我们应用这种显示器看图片,图片明显看起来会暗很多。所以不同的应用领域对此作了相应的补偿,video主要是在摄像机里进行了gamma2.2的矫正,PC电脑在framebuffer之后进行了gamma2.2的矫正。Mac分别在framebuffer之前进行了和之后分别进行了矫正。那么显示器的gamma2.5我们只给了2.2的矫正剩余的2.5/2.2 gamma1.136是用来匹配人类视觉感知的。人眼有这么一个特点:


同一块颜色在暗的背景下和亮的背景下看,给人亮度的感觉是不一样的。在暗的背景下感觉会更亮一些。而我们正常的显示器一般都是在较暗的背景下看的。在标准的测试环境下gamma1.136正好可以抵消这种视觉偏差。所以我们在理想情况下看到的显示器是线性的。

(如果我不说显示器的gamma,不了解的人会以为显示器有gamma,这样一来很多理论会说不同。)


那么我们正常情况下所说的“CRTgamma2.2”指的是什么呢?这就涉及到了windows色彩管理:默认的sRGB。我们目前的显示器只能显示8bit图,大多数显卡的framebuffer 也只能处理8bite数据,就是说超过8bit的图片显示器是不能完全显示出来的。

就是说我们只能给显示器8bit的图,这就出现了一个问题。又是人的眼睛。


正常人眼察觉明度差别的边界是1%,就是说如果两块颜色明度差别超过1%我们的眼睛感觉到边界。图片里就会出现边界线条。那么8bit的图在100色阶以下,明度对比都超过1%,在较暗的场景里就会出现很多的颜色边界。那么这是发生在 linear 8bit空间下的。linear就是说0是最暗,1是最亮,0.5是中间亮度。为了解决暗部色阶不够明度差别过大我们只有将更多的空间分布给黑暗的区域才可以取消这种差别。如果是线性需要大概14bit的数据,而亮部很多数据是无用的。这就引进了非线性空间。


sRGB是微软和惠普联合开发的一个色彩管理标准,目的就是在多平台,多设备下能够很好的显示图片。基于硬件的局限它被定义在8bit,最大值为1不可以超过1



这个色彩管理标准将更多的空间给了暗部,解决了暗部色阶不够问题。而这个曲线恰巧去gamma2.2极其匹配。Window应用这种色彩管理标准作为默认设置。因为window知道sRGB空间的特点所以它能够正确地显示sRGB的图象,比如这个像素的值是0.2他会让显示器发出0.12倍的电压。我们日常应用的大多数8bit 16bit图片都是基于这个标准的,比如最常用的jpgtiftarga 等。




因为gamma2.2sRGB的曲线非常接近,我们很多情况下的色彩空间转换,匹配都应用一个简单的gamma2.2操作。sRGB很好,它能很高效的应用数据显示图像,但是在我们进行图形操作的时候会出问题。因为sRGB是非线性空间。 因为他把更多的值给了暗部,0.5并不代表0.5而是0.21左右。但是我们日常应用的软件并不知道他读入的图片的色彩管理模式它全部以linear空间来进行计算。这时候就出问题了。



3d渲染得时候出错的地方

    1. 2 + 2 = 10 (灯光师的感觉,灯光易爆)

    2. 不能应用2次方衰减

    3. Mentalray的物理渲染

    4. 取色器。

    5. 所有对材质的调整

    6. 测试观察的图片时错误的

    7. Etc


后期操作时再不转换色彩空间的情况下各种操作也不够精确。(也就是错误的)。



在这里首先要说一点。Mayamentalray, renderman,等大多数渲染器渲出来的8bit, 16bit图片都是linear的。也就是说没用经过gamma矫正(转换到sRGB空间)。而我们是在windows默认sRGB空间下观看。我们只有在sRGB空间下看sRGB空间的图片才是正确的。



  1. sRGB空间下看线性图片的问题(二次方衰减)。涉及在sRGB空间下看linear图片的问题。对比曲线,指出sRGB色彩管理会将linear图片变暗显示,因此我们要正确显示linear图片需要将其变亮,因此给一个gamma 0.45454的值。这也是我们为什么不能应用灯光二次方衰减的原因。我们如果需要将linear图片变亮,只能不断的提高强度而我们输出8bit图,值只能卡在第256个色阶上,所以我们以前不能应用二次方衰减。

  2. 用曲线表示两个sRGB值相加的问题2+2=10。一幅图片上两个像素点。在sRGB上分别标出两个点的位置对应指出他们在sRGB曲线上和linear曲线上分别对应的值,分别相加。想象得到的这个值是用sRGB来显示的会是什么样的?这是个简化的相加原理。指出渲染器取的值是linear 上的值。

  3. mentalray的物理渲染要求更精确如果素材错误结果很难调整。

  4. 我们的取色器是错误的



具体应用方案

因为我们已经理解了原理,具体解决方案就不会晕了。


首先介绍两个节点。Gamma correction node, mia_exposure_simple



比较理想的解决方案:基于32 bit float point 输出,这样我们就不需要考虑输出时gamma矫正的问题,这部分在后期里操作。


输入:对所有非linear图片进行转换。

  1. 照片和photoshop处理的图片基本上都是gamma2.2。给以gamma0.455的矫正。

  2. 3d输出一般都是linear。不需矫正。

  3. Bumpdisplacement不需矫正。

  4. 32bit float point. Openexrhdr,一般是linear不需矫正。


测试察看:

Mentalray: 加一个mia_exposure_simple.

Maya software: batch输出tiff16, 在后期里矫正察看。


输出:

Mentalray: 8bit 16bit mia_simple_exposure photographic(比较复杂)。因为这是在mentalray内部浮点形式进行的gamma0.4545转换。在后期里会有损失但是对于16位可操作余地更大。

Mentalray32 bit float point 不加任何节点,直接输出Openexr格式。在后期里进行调整。

Maya software: 输出tiff 16 在后期里进行调整。


例子:一个标准的操作。


Openexr的优势:

Simplified pixel math

Rendering

Filtering

Transformations & Drawing

Color correction


Openexr 例子,

Nuke基于线性操作更精确的例子。


1 条评论:

  1. 你好,希望和你一起讨论NUKE。
    我的QQ22053672
    打扰了。

    回复删除