Substance Painter 和 Unreal Engine 两者的显示是有差异的,主要原因是 Unreal Engine 使用的是 ACES1.0.3,并且 UE 还对其进行了一些修改,而 Substance Painter 默认 sRGB 的渲染输出。 其实之前也有两种方法来实现两者的匹配,一个是利用第三方的 ACES 的材质来实现,另外一个是利用 LUT 来实现,之前我有篇文章中也提到了具体方法
不过在去年 Adobe 终于全部支持了 OCIO,包括 Substance Painter 在内的工具,都可以完整的使用 OCIO 流程来达到与其它平台的颜色统一管理及渲染效果的一至性。
使用 OCIO 来进行颜色管理的优势在于它的流程上是更加完善科学的,并不会像使用 LUT 那样只是做为最后的渲染进行转换,ACES 是个完整的系统(或者叫说工作流),它也包括了输入时的 IDT,中间会全部转为 ACEScg 的色彩空间,之后渲染显示进行了 RRT,最后输出贴图再进行 ODT,因此从你加载进一张贴图,到指定一个颜色,再到修改某个参数的强度的时候,它就已经开始了 ACES 的转换工作,缺失了前面的步骤,得到的材质效果会是有差异的,虽然它非常微小,但是为了严谨,应当保证整个工作流的完整性,才能在不同平台上显示同样的结果。 尤其在制作贴图时,如果是 LUT 的工作流程里,进行拾取颜色或者输入颜色,你不管是从视口中取到的颜色,还是从色板上取的颜色,都并非最终显示的颜色,这对于编辑制作时是有割裂感的,而采用 OCIO,能保证你在统一的色彩空间中工作。
所以此篇文章就讲一下在 Substance Painter 中如何利用 OCIO 来与 UnrealEngine 进行颜色的匹配。
最简的办法就是将 Substance Painter 的项目设置中将颜色管理切换为 OCIO,可以使用 ACES1.0.3 或者更高级版本的配置文件(UE4 使用的是 ACES 1.0.3),其实这里用哪个版本都可以(1.0.3 之后的版本主要是针对 HDR 显示设备的支持更新)。

在输出设置中可以修改,也可以不修改,如果极为严谨,应该使用 Output-sRGB,因为 UE4 输入的所有纹理应当是 sRGB 的(UE 并没有完全遵循 ACEScg 的流程,应该是 UE 考虑到易用性,不过不影响结果,只是流程上不够优雅,它其实是使用的是 sRGB—>ACES2065-1—>RRT—>ODT。在 UE5 中已经可以手动添加纹理的颜色配置了)。
这个时候输出贴图,那么会发现在 UE 中显示的结果还是有些差异。是因为 UE 虽然是使用 ACES,可是进行了些修改,最大的出入是 UE 在曝光上乘了 1.45,其次是在蓝光抑制blue correction。因而你必须在 SP 的后处理中加大曝光值。
因此,并不能直接使用默认的 ACES 的配置文件,如果使用 OCIO,那就需要对其进行修改, 以下是官方论坛中给的示例:
- !<ColorSpace>
name: ACES sRGB ODT
family: View
equalitygroup: ""
bitdepth: 32f
isdata: false
allocation: uniform
allocationvars: [0, 1]
to_reference: !<GroupTransform>
children:
- !<FileTransform> {src: InvRRT.sRGB.Log2_48_nits_Shaper.spi3d, interpolation: tetrahedral}
- !<FileTransform> {src: Log2_48_nits_Shaper_to_linear.spi1d, interpolation: linear}
- !<ColorSpaceTransform> {src: Colourspace - ACES 2065-1, dst: Model - Reference}
from_reference: !<GroupTransform>
children:
- !<ColorSpaceTransform> {src: Model - Reference, dst: Colourspace - ACES 2065-1}
- !<FileTransform> {src: Log2_48_nits_Shaper_to_linear.spi1d, interpolation: linear, direction: inverse}
- !<FileTransform> {src: Log2_48_nits_Shaper.RRT.sRGB.spi3d, interpolation: tetrahedral}
- !<ColorSpace>
name: UE4
family: View
equalitygroup: ""
bitdepth: 32f
isdata: false
allocation: uniform
allocationvars: [0, 1]
to_reference: !<GroupTransform>
children:
- !<ColorSpaceTransform> {src: ACES sRGB ODT, dst: Model - Reference}
- !<CDLTransform> {slope: [1.45, 1.45, 1.45], direction: inverse}
from_reference: !<GroupTransform>
children:
- !<CDLTransform> {slope: [1.45, 1.45, 1.45]}
- !<ColorSpaceTransform> {src: Model - Reference, dst: ACES sRGB ODT}更简单的办法是直接使用 UE5 的 OCIO 插件中所带的 OCIO 文件。 位置在
\Engine\Plugins\Compositing\OpenColorIO\Content\OCIO\simple.config.ocio
只要 SP 直接加载此文件就可以。
具体设置如下:

正确加载 OCIO 后,在 3D 视口中就可以切换 sRGB-UE,现在将会得到与 UE 一模一样的结果。

最终显示对比:


注意,需要关闭两个平台上的主光源照明及 shadow 和后处理,SP 中可以关闭 AO 效果,两个平台可以调整相当相机的 FOV 以及 HDR 环境照明贴图的旋转做到匹配一至