查看文章 |
1, 什么是线性工作流程? 线性工作流程确切的说是匹配软件的线性工作流程。这种流程在近几年被广泛应用于电影广告等高端项目。国外大型工作室几乎都是基于这种流程。实际上我们需要物理上正确的计算,那只能是基于线性工作流程。不幸的是,我们以前都不是基于这种流程。就是说理论上我们以前和现在几乎所有的maya渲染,后期制作都是基于错误的计算方式。能够接受它是因为我们在错误的基础上让它看起来“好看”(其实并不正确)。
那么具体什么是线性工作流程呢?线性工作流程就是软件在计算时,所有参与计算的数据都是基于线性的。我们使用的几乎所有图像处理软件都是基于线性的计算方式。就是说 1+1=2 2*2=4 128+128=256。我们使用的maya, max,nuke,shake,fusion,photoshop,mentalray, maxwell都是这种计算方式。这种流程的正确的前提是它在计算前所有的素材,条件,灯光都是线性数据,1代表的是1,5代表的是5。但是我们现在的流程是非线性的(错误的)。主要原因:
2,基本概念 如果我们要充分理解线性工作流程首先需要弄清几个概念。Linear,sRGB, gamma,windous 色彩管理,显示器部分原理,眼睛的部分感官特点,8bit, 16bit,32bit.
3,先从显示器说起,我们常说“CRT显示器的gamma是2.2,苹果是1.8”这种说法是不正确的。 什么是gamma?gamma是一个非常模糊和不精确,被乱用的一个概念,现在其已经几乎被禁止使用的一个单位。它最早是用来表述胶片曝光的log曲线和胶片线形密度的关系。后来被各种工业部门用来表述类似的关系,数学上大概可以表示为:
y = xr(2.2)
曲线的形式
我们常用的CRT显示器,不论他是苹果的还是什么的出场的时候本身的物理gamma值都是2.5。主要原因是撞击显示器荧光粉的电子强对于电压的反应不是线形。大概可以用gamma 2.3 – gamma2.5来表示。而如果我们应用这种显示器看图片,图片明显看起来会暗很多。所以不同的应用领域对此作了相应的补偿,video主要是在摄像机里进行了gamma2.2的矫正,PC电脑在framebuffer之后进行了gamma2.2的矫正。Mac分别在framebuffer之前进行了和之后分别进行了矫正。那么显示器的gamma是2.5我们只给了2.2的矫正剩余的2.5/2.2 gamma1.136是用来匹配人类视觉感知的。人眼有这么一个特点:
同一块颜色在暗的背景下和亮的背景下看,给人亮度的感觉是不一样的。在暗的背景下感觉会更亮一些。而我们正常的显示器一般都是在较暗的背景下看的。在标准的测试环境下gamma1.136正好可以抵消这种视觉偏差。所以我们在理想情况下看到的显示器是线性的。 (如果我不说显示器的gamma,不了解的人会以为显示器有gamma,这样一来很多理论会说不同。)
那么我们正常情况下所说的“CRT的gamma是2.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图片都是基于这个标准的,比如最常用的jpg,tif,targa 等。
因为gamma2.2和sRGB的曲线非常接近,我们很多情况下的色彩空间转换,匹配都应用一个简单的gamma2.2操作。sRGB很好,它能很高效的应用数据显示图像,但是在我们进行图形操作的时候会出问题。因为sRGB是非线性空间。 因为他把更多的值给了暗部,0.5并不代表0.5而是0.21左右。但是我们日常应用的软件并不知道他读入的图片的色彩管理模式它全部以linear空间来进行计算。这时候就出问题了。
在3d渲染得时候出错的地方
后期操作时再不转换色彩空间的情况下各种操作也不够精确。(也就是错误的)。
在这里首先要说一点。Maya,mentalray, renderman,等大多数渲染器渲出来的8bit, 16bit图片都是linear的。也就是说没用经过gamma矫正(转换到sRGB空间)。而我们是在windows默认sRGB空间下观看。我们只有在sRGB空间下看sRGB空间的图片才是正确的。
具体应用方案: 因为我们已经理解了原理,具体解决方案就不会晕了。
首先介绍两个节点。Gamma correction node, mia_exposure_simple
比较理想的解决方案:基于32 bit float point 输出,这样我们就不需要考虑输出时gamma矫正的问题,这部分在后期里操作。
输入:对所有非linear图片进行转换。
测试察看: Mentalray: 加一个mia_exposure_simple. Maya software: batch输出tiff16, 在后期里矫正察看。
输出: Mentalray: 8bit 16bit 加mia_simple_exposure 或photographic(比较复杂)。因为这是在mentalray内部浮点形式进行的gamma0.4545转换。在后期里会有损失但是对于16位可操作余地更大。 Mentalray:32 bit float point 不加任何节点,直接输出Openexr格式。在后期里进行调整。 Maya software: 输出tiff 16 在后期里进行调整。
例子:一个标准的操作。
Openexr的优势: Simplified pixel math Rendering Filtering Transformations & Drawing Color correction
Openexr 例子, Nuke基于线性操作更精确的例子 |

