场景线性绘画

场景光线性绘画和我们之前提过的 HDR 绘画和场景光参考绘画是一回事。场景光线性绘画是在一种特定色彩空间下的数字绘画作业方式。该色彩空间必须满足下面的条件:

  1. 线性 - 色彩空间不使用 gamma 编码,或者色调映射之类的会影响你正在操作的像素的功能 (这与你正在观察的像素不是一回事,我们会在后面讨论)

  2. 浮点 - 每色彩通道 16 位浮点或 32 位浮点。

这两项特性是最重要的。色彩空间的其他属性,像白点、色域的组成颜色等可以五花八门,但只要该空间是线性的,色彩位深是浮点的,那就行了。

因此,场景线性并不是一个特定的色彩空间,而是指 一类 具有某些特性的色彩空间。你使用的场景线性空间的色域可以是 sRGB/Rec. 709 的,也可以是 AdobeRGB 的,甚至是 Rec. 2020 的,只要它是 线性的 并且 使用浮点位深度的通道 即可。

注解

如果你要为 HDR 画布空间创建图像,应选用具有线性 gamma 的 Rec. 2020 空间特性文件。Krita 为此默认的特性文件是:Rec2020-elle-V4-g10.icc

必须满足这两个条件的目的很简单:让黑和白的数值可以随意设定。这听起来有点奇怪,请容我慢慢道来。颜色的明暗范围在不同光源下面可以发生很大变化,比如:一片月光下的花田、沐浴在暮光中的都市、阳光明媚的沙滩等。为了在一个场景里面突出它最重要的明暗对比,每个场景都应被设为最适合它们的黑、白数值,这也是“场景线性”这个名字里面“场景”的来由。自由选择黑白数值的能力是控制场景明暗对比的有力工具,这跟眼睛通过收放瞳孔和切换感光细胞类型来适应白天和夜晚的道理是一样的。我们为什么不把这种思路应用到图像的制作中去呢?

我们之所以要求使用线性的色彩空间,是因为使用 gamma 校正和色调映射的色彩空间已经硬性规定了它们认为是最重要的明暗对比区域,并为此选取了固定的白和黑的数值。线性空间不存在上述情况 ,所以更方便用户自行选择。虽然你终究会把图像转换成 gamma 校正或色调映射的色彩空间,但那应该是在完成颜色混合和应用滤镜等操作之后进行输出时才做的最后一步。

其实在你处理包含阶调映射的图像时,图像总是经过了某种非破坏性的色彩转换之后才显示在屏幕上的。这种转换并非发生在图像数据层面,而是发生在视图和显示器的层面,这也是色彩管理的最主要功能——确保颜色可以正确地从工作空间转换到显示器特性空间,使图像的颜色能够准确显示。

视图和显示器的色彩转换也有许多种形式。有些简单粗暴,有些复杂讲究,有些还需要通过特定的用法才能正确工作。ICC 色彩管理系统只能提供一种形式的视图转换,而在 LUT 工具面板中的 OCIO 色彩管理系统可以进行更加复杂的转换,配置起来也很方便,它的配置文件还可以和Blender 等其他程序通用。

../../_images/Krita_scenelinear_cat_01.png

上图给出了一组例子进行对比。左图用一种较为简单粗暴的方式把原图从场景线性 sRGB 转换为了常规 sRGB,右图则通过 Blender 的 filmic OCIO 配置进行了更精细化的转换。留意猫爪处的不同。图像作者:Wolthera van Hövell tot Westerflier,许可协议:CC-BY-SA

但另一方面,对图像色彩进行转换和演绎是 OCIO 的唯一功能。虽然 OCIO 可以快速进行复杂的转换,但它并不能理解图像原本的色彩空间,也不能理解 CMYK,也没有相应的 OCIO 色彩特性文件,所以在准备打印图像时必须切换至 ICC 工作流程。

场景线性绘画的意义

按长远来说,它可以使日后的工作更轻松:

  1. 高饱和度、非灰调的颜色在线性空间中更容易保持纯净。

  2. 高位深下更容易得到平滑的颜色混合效果。

  3. 滤镜在线性空间下的性能和效果都更好,更容易生成好看的模糊和光晕效果。

  4. 相乘、相加之类的简单混合模式效果会突然变得极为好用。这是因为线性空间与色彩运算的物理学模型最为接近,在这个模型里光的效果本来就是通过将色彩数值的坐标相乘得出的。

  5. 将绘画过程与其他图像如照片等的整合将更加方便,毕竟它们也在使用同类色彩空间。这让你在使用参考图像时不必担惊受怕,为渲染器等准备图像时也会更加得心应手。

总的来说使用线性空间的好处是:更好看的颜色、更好用的滤镜、更好的色彩控制和在不同工作流程之间更方便的图像交换。

场景线性绘画的限制

简单来说,虽然线性空间是个长久之计,但它要求你必须在当下就抛弃熟悉的工具和摒弃多年的习惯。

尤其需要指出的是,在数字绘画工具箱中的许多工具都 对白和黑的数值作了硬性规定

一个简单却很大的问题出在 反相 运算上面。颜色的反相在代码层面是用白减去被反相的颜色,许多混合模式和滤镜都在使用反相代码。问题是当前并没有软件允许用户设置反相操作的明度范围,它们全都硬性规定了白的数值,这么一来在线性绘画下面反相功能就废了,使用这种代码的滤镜和混合模式也就跟着废了,它们包括但不仅限于:

  • 滤色 (反相+相乘+反相)

  • 叠加 (对明度低于中间调的颜色进行滤色,在 sRGB 下把中间灰用作中间调)

  • 颜色减淡 (下层颜色与上层颜色的反相相除)

  • 颜色加深 (下层颜色的反相与上层颜色相除)

  • 强光 (也是一种进行叠加的算法,它也用到了反相)

  • 柔光 (在运算过程中用了好几次反相)

另一方面,相乘、线性减淡/相加 (这两个其实是一回事)、相减、相除、调暗颜色 (仅对比色彩通道数值)、调亮颜色 (同上)、插值等模式 均可正常使用 ,只要你的软件不对颜色进行了更多怪异的操作就行。

还有就是使用 HSL、HSI 和 HSY 模型的各种算法。这些模型必须假定一个最大明度为白,以此为准对空间进行等比缩放。HSV 不存在这种问题,所以最好使用 HSV 模型的拾色器。

使用 HSY 的混合模式一直有着硬性规定使用 sRGB/Rec. 709 明度值的毛病。虽然除此之外问题不大 (实际上它们在线性空间里能给出准确得多的结果),但它们并不适合用于宽色域的色彩空间。也因为它们硬性规定了白和黑,所以也不适合用于场景线性绘画。使用 HSY 的混合模式如下:

  • 颜色

  • 光度

  • 饱和度

  • 较暗颜色 (使用光度来决定颜色)

  • 较亮颜色 (同上)

混合模式的问题就这么多,可滤镜的问题也不少。大多数应用软件的滤镜并不能在自定义白下面正常工作。

说到滤镜 (过滤器),在使用变形工具时你应该避免使用 lanczos3 过滤器,它会在场景线性的锐利明暗线上生成古怪的暗色光晕。双线性插值过滤器就不会有任何问题。

第二个大问题则是 黑的混合效果不同了

如果你以前调过颜料,应该知道黑颜料特别容易盖过其他颜料,所以用一丁点儿就足够了。而白色则特别容易被其他颜色弄脏。

可在场景线性颜色空间下面情况却恰恰相反。白非常强势,黑却特别容易被冲淡。这其实是计算机色彩理论所用的加色法所决定的,只是在线性空间下面这种差别变得尤其明显而已。

这个问题会影响你画草图,毕竟现在想要留下点笔迹要费老大劲了。要应对这个问题,你可以采用下列办法:

  • 在中性灰背景上起草。这本来就是一种值得推荐的习惯,因为它带来了中性的背景色。对于线性空间来说,18% 或 22% 的灰是理想的中性灰。

  • 制作一个比你的常规起草笔刷更加不透明的笔刷。

  • 或者反过来用白来起草。

  • 对于绘画上色,可先用不透明的粗笔刷把底色填满对象轮廓后再进行颜色混合。

万事开头难,这需要一点磨合的时间,但你应该可以很快适应。

最后的问题就是 文件体积

每通道 16 位浮点的图像体积很大,而 32 位浮点的就更不用说了。它们要消耗大量的内存,绘画过程和滤镜的处理也会变慢。这些问题应该会随着科技的进步逐渐缓解,可现在不是每个人都有足够强大的计算机,所以这将是一个阻碍因素。

所以问题出在:工具兼容性、定势思维还有文件体积上。

总结

场景线性绘画是指的是在浮点色彩深度的线性色彩空间下面作画。这种模式不会硬性规定白和黑的数值,所以你只能使用不会硬性规定白和黑的工具。它的优点是滤镜和颜色混合的效果更好,与其他场景线性输出的互换性也更好。

要想查看这样的图像,你要使用视图色彩转换,也叫做显示器转换。在为互联网输出图像时,你必须把视图转换显示的图像结果保存成 PNG 或 JPEG 或 TIFF 格式。

场景线性绘画实践

我们说完了理论,接下来就该介绍一下场景线性下面的绘画流程了。

设置画布

在选择创建一张 16 位或者 32 位的图像时,Krita 会默认选中一个线性 sRGB 特性文件。如果你要为 HDR 显示环境创建图像,你要确保选中的特性文件是 Rec2020-elle-V4-g10.icc。HDR 图像规定使用 Rec. 2020 色域,它的色域体积要远大于 sRGB,因此可以确保你能够使用全部颜色。

如果你使用非 HDR 显示器工作,应在 LUT 工具面板中启用 OCIO。

时刻留意前文提到过的各种问题:不是所有滤镜和混合模式都能正常工作。这些日后会得到改进。绘画的其他方面应该不受影响。

如何拾取极亮颜色

拾取一般颜色很容易,但我们要如何去拾取非常亮的颜色呢?在 Krita 里面有三种获取极亮颜色的方法:

  1. 把 LUT 面板里面的曝光调低。这将增加拾色器中的可见颜色范围。你还可以指定画布快捷键来控制曝光。

  2. 小型拾色器 的 nits 滑动条拉到 100 以上。

  3. 或者通过双击双重颜色按钮打开内部拾色器,在明度框输入大于 1 的数值。

  4. 最后从具有极亮色数值的图像中拾取它。

接下来就可以使用拾取到的颜色绘画了。在 Krita 的全新色板面板就位之前,请先在画布上的一角留存所用颜色以代替目前无法正常保存该颜色的色板。

基于光照的绘画流程

我们对典型的基于明度的绘画流程已经很熟悉了。在这种流程里我们只需在图像的底色上面新增一个相乘模式的图层,然后在上面用灰色作画,把注意力全部放在控制图像各处的明度上。我们也可以在场景线性绘画中进行类似操作。

在基于明度的绘画流程里绘制明度图层就像是在画一张灰度图,所画的部分都会让混合后的颜色变深。而在基于光照的绘画流程里光照图层的光是可以有颜色的,对象的固有色和光色相乘后得出混合结果。你可以先在光照图层中把对象的底色想象成白色,分析带有颜色的主光源和环境光在这个白色对象上的受光情况,然后这种带有色调光照的受光图给画出来。在另一个图层上绘制对象的固有色,最后使用相乘混合模式就可以得到正确的颜色了。

../../_images/Krita_scenelinear_cat_02.png

左图是光照图层和分离的底色图层,中图是这两个图层相乘混合后的效果,右图是混合后的光度图。这张猫图很好地展示了分开处理材质和光照的有趣之处。

要想在绘画时随时观察右图那样的合并后的光度图,你可以为当前图像新建一个新视图,然后在 OCIO 面板把它的将明度分量设成光度。

聪明的人会发现基于光照法的绘画流程跟 3D 渲染中的光照和底色差不多。这一点也没错,你可以在这里直接使用来自 3D 引擎输出的光照图,只需将它们保存为 EXR 然后作为图层导入即可。这也是场景线性绘画可以简化图像合并手段的一个例子。

结语

在你画完之后,你要把施加在图像上的视图色彩转换进行应用 (如果你需要把图像发表到互联网上的话)。这个过程叫做 LUT Baking (烘焙),目前 Krita 还不能做到。因此你要将图像另存为 EXR 文件,然后用 Blender 或者 Natron 打开。在 Blender 里面加载相同的 OCIO 配置,选择正确的参数并把结果保存为 PNG 图像。

关于 HDR 图像的保存,参见 HDR 显示器 页面。

在此阶段你还可以应用 Blender 和 Natron 的滤镜,如果需要协作,你应将图像保存为 EXR 格式以便他人使用。