原文链接:https://www.toadstorm.com/blog/?p=694

我决定正视一下ACES流程了,这个是一个比较好的入门理解,所以翻译一下分享出来。对于一些想补充的话,我会在行文之间用小字标识。

我拖延了很久没有了解ACES了,因为几乎所有网上的文章都过于专业和冗长,再或者就是读起来像是销售广告,对于如何使用一点帮助都没有。如果想正确使用ACES,需要大量的练习和研究,所以我一直都在常规的“线性流程(linear workflow)”,尽量不去考虑ACES。

但是现在我自己有了一个小团队,也许是时候真正的去了解ACES了,所以这篇文章就是记录下我所了解的“为什么&怎样在你的工作中使用ACES”。或许我会(绝对会)忽略一些细节,但是这些冗长无聊的细节本身就是给那些聪明人看的。当然你可以随时在底下评论回复我。(这是作者说的,不要评论我,我对这篇文章不负责)

重要提示:我是一个(技术向)3D艺术家,不是颜色科学家。在这篇文章中“笨蛋”是指的我。我尽量将复杂的理论转换为普通人能理解的词。我喜欢在一些地方走捷径或者做一些妥协,这可能会让一些真正的颜色科学家吐血,但是这就是现实…有时候你不得不打破一些规则来满足客户的想法。

什么是他妈的ACES?

ACES是一套颜色系统,它可以定义颜色管理的标准,不管你的颜色是从哪里来的(拍摄或者CG渲染等等),并且提供一个面向未来的工作空间,以便让所有的艺术家能在所有的生产流程中使用。不管你的图片怎么来的,你都能顺滑的将他们转换为ACES颜色标准,这样你团队的所有人都能保证在一个统一的环境下工作了。

对于CG艺术家来说,最大的受益就是ACEScg色域,它的色域要远远超过传统sRGB所包含的颜色。即便你在线性颜色空间中使用浮点式渲染(我的理解是指渲染16bit或者32bit的图片),也就是所谓的线性工作空间(linear workflow),你的原色(原色定义了什么是红绿蓝)仍然是sRGB,这会限制你的颜色精准表达。

我们通常理解的“linear”和“sRGB”有一点误区,线性颜色空间也可以使用sRGB原色,也是我们通常不使用ACES流程的来处理“linear”贴图或者渲染的颜色管理方式。而我们通常称作“sRGB”也是使用sRGB原色,只不过应用了伽马2.2,这样就可以在一般显示器上正确显示了。

换句话说,ACEScg使用了自己的一套原色叫做“AP1”,它可以容纳更多的颜色,就像上面那张图里说明的那样。记住,sRGB或者Rec.709标准是我们仍然使用CRT显示(大脑袋)的时代发明的,是时候走向新时代了。

这是一张快速演示来展示传统sRGB“线性”工作流和ACES工作流的区别。你能马上注意到右边的颜色更加自然,尤其是在一些过亮和过饱和的区域。

ACEScg是ACES颜色空间的一种,专用于CG艺术家,因为它是线性编码(与之对应的是指数编码,也是普通人认为的曝光),(也就是一张图被线性显示还是应用伽马2.2显示),所以你的渲染引擎和合成软件能够很好的操控它。还有其他的颜色空间定义,比如ACES 2065-1,是为了归档和数据转换使用,但是作为CG艺术家,你只需要理解ACEScg就足够了。

视窗监视LUT

我们刚刚知道了ACEScg是一个颜色空间。然而,你的垃圾显示器并不能显示完整的颜色空间。即便你有一个很好的显示器,但它仍然只能精确显示DCI-P3色域,仍然不足以显示完整的ACEScg。显示不到的色域部分也需要你定义一下显示器的显示方式,也就是你的监视空间。这有点类似于你查看线性渲染,但是看上去非常暗,你必须选择“sRGB”或者“gamma2.2”查看方式才能正确显示。不管图片本身是什么颜色空间,都需要转为你的显示器正常监视的空间。

监视空间取决于你的显示器情况,但是如果你的显示器没那么离谱,大概率是sRGB或者Rec.709(这两者非常非常相似)。你需要确保你在查看或者合成你的渲染图片时,使用了正确的监视LUT让图片从ACEScg转为sRGB或者Rec.709。

这种“输出(Output)”颜色空间在ACES流程中被称为“RRT”,也就是“Reference Rendering Trasnform”。用一个过于专业的话说,这是一个在你的ACEScg场景和你的sRGB或者Rec 709监视空间中发生的额外转换。RRT非常像经典的S曲线,可以让你的渲染或者素材得到更暗的暗部和更亮的亮部。看上去很好,但是当你用“额外”的输出颜色来匹配输入颜色时,会带来一个复杂的问题,尤其是广告中要将外部导入的商标匹配到某个物体上时,这个我们后面再说。

转换输入贴图

你必须确保任何应用的贴图都已经转换为ACEScg色彩空间了。这部分或许有些棘手,因为贴图的来源多种多样。你需要应用“input device transform”或者“IDT”到这些贴图上(类似将ACEScg空间转为正常查看的sRGB空间的“RRT”过程,我们还需要将不是ACEScg空间转为ACEScg空间的“IDT”过程)。大多数从网上下载的贴图都是sRGB色彩空间,也就是你在OCIO中看到的“Utility-sRGB-Texture”。如果你已经有一个线性EXR格式贴图或者渲染图片,你的IDT需要改为“Utility-Linear-sRGB”。这里的命名会导致一些困扰,因为关于颜色的所有东西都能让人困扰。“Linear-sRGB”这里指的是你处理一张线性编码的渲染图片,而不是包含tonemapping曲线,但是仍然使用的是sRGB原色。典型的Jpg图片也是使用的sRGB原色,但是它被编码了gamma2.2曲线,所以不算是线性的。

当你犹豫不决的时候,就记住如果图片不是浮点值,使用Utility-sRGB-Texture,不过是浮点值,使用Utility-Linear-sRGB。(这里其实不太准,不是浮点值我理解的是说8bit图片,但是我经常渲染16bit的图,但是其实还是sRGB,不是线性的。我觉得最好的判别方式是看这张图暗不暗,但是32bit的HDR贴图一定是使用Utility-Linear-sRGB的)

不过你只需要转换描绘颜色的贴图,而不是描述信息的贴图。diffuse或者albedo贴图就是描述颜色,需要被转换。normal、displacement或者roughness描述数据,不应该被转换。牢记这个注意事项。

恼火的ACES陷阱

当然了,除了需要阅读几篇这种文章,关于ACES还有一些恼人的地方,尤其是对于我们这种渲染图片而不是真实图片的人来说。最大的问题就是在ACES空间中匹配参考图片。比如matte painting或者需要被跟踪的手机屏幕,或者任何自发光但是不是用来作为光源的物体。如果你使用通常的sRGB->ACEScg转换,你会注意到你的自发光材质在渲染中会总显得不够亮。

这种情况下,取决于你处在什么阶段,有那么几种方式。

如果你想要自发光材质渲染出来的结果和你在转为ACES流程之前的结果一样,你需要转换贴图为ACEScg,但是是从OUTPUT空间而不是常用的input空间。也就是说如果你的监视LUT用的“Output-sRGB”空间,需要给材质的input空间也使用这个。这样就能从感官上确保你的监视LUT,包括之前提及的RRT的s曲线tonemapping的相反转换会应用到材质上,所以会看上去和没转换为ACES之前一样。这意味着你的渲染结果可能会很奇怪。看下这张截图,注意OCIO转换设置和左边窗口显示的颜色信息。

这张截图中,你能看到“白色”值已经超过了16,其他颜色或许也会被这个操作影响,尤其是处理非常亮或者过饱和的颜色。在调试全局照明或怪异的反射或其他渲染故障问题时,或在渲染后对这些渲染进行调色时,要记住这个数字!

在合成时,你最好的解决办法就是临时退出ACEScg空间,最好是在你快要结束合成工作时。使用OCIO转换工具来将ACEScg转为sRGB,将监视LUT调为标准sRGB,然后对你的想要操作的sRGB元素进行合成,比如屏幕、字幕或者其他什么东西。这个方式可以避免上面提到的奇怪的颜色数值,但是当你输出HDR分发格式时会出问题。

(因为我也没有完整的使用ACES流程的经验,实际上这一小节我完全没懂)

最后

即便是当作快速实用的指导,也需要进行一定的思考才能理解。ACES系统是一个很好的想法,但是解释起来仍然很困难和反直觉。这需要你的团队所有人都对什么是颜色空间转换以及什么时候转换有一定的理解。我希望这篇文章至少能让你理解一些基础,当你想阅读更深层次文章时候,我推荐下面这些文章:

ACES Primer:

https://acescentral.com/uploads/default/original/1X/6ad8b74b085ac8945c1e638cbbd8fdf687b7f60e.pdf

Chris Brejon’s ACES Guide: 

https://chrisbrejon.com/cg-cinematography/chapter-1-5-academy-color-encoding-system-aces/

结尾

到这里翻译就结束了,作者还讲述了各个软件怎么搭建ACES环境,偏向影视方向的,这里先不提,以后有机会单独说,这样还能多发几篇文章,我太聪明了!

下面还有一些读者的评论,这里也稍微翻译一下有用的部分:

Q:当我们渲染CG的时候,使用ACEScg和渲染线性(sRGB原色)然后转为ACEScg有什么区别吗?

A:将全部东西都转为ACEScg才能得到AP1原色。如果只是渲染linear sRGB然后后期转为ACEScg,这并不会在渲染计算光线时带来任何更高的色域。你仍然会得到一个不真实的、过饱和或者其他看上去很CG的渲染结果。

Q:在houdini使用OCIO Transform VOP`s时候,如果不勾选“Linearize Non-Linear Images”会得到一个过饱和的结果,你推荐应该怎么设置参数呢?

A:我没有一点一点的对比过,但是我倾向于使用OCIO精准的调节你希望怎么转换颜色,而不是靠houdini自动猜测的结果。

Q:我这样操作是正确的吗?sRGB颜色空间的16bit diffuse exr文件,(也是substance painter导出的图片),应该转换为Utility-texture-sRGB->ACEScg。对于HDRIs,linear但是还是sRGB原色,应该设置为Utility-linear-sRGB->ACEScg。对于roughness和displacement等等,应该设置为Utility-raw->ACEScg。如果是选择了Utility-raw,贴图不会有一些改变的?

A:是的,在我看来没错。并且我认为你的直觉是对的,使用Utility-raw->ACEScg或者转为其他什么空间,都不会对贴图进行任何操作,就是直接“通过”的意思。

(完)

Leave a Reply