色调映射(Tone Mapping)带来的困扰

前言

色调映射(Tone Mapping)功能的目的是将宽范围的高动态范围(HDR)颜色映射到显示器可以输出的低动态范围(LDR)。显示器所能显示的颜色范围,小于真实世界的颜色范围。这是后处理的最后阶段,在后处理期间正常渲染之后进行。色调映射过程可以被认为是一种模拟胶片对光的响应的方法。

从虚幻引擎版本4.15开始,电影色调映射器作为默认色调映射器被启用。简单来说,一张纯白(255, 255, 255)的图片,UE4认为渲染不真实,就通过色调映射使其没那么刺眼的白,也就是灰了一些。然而并不是所有UE4的使用者都需要这个色彩“优化”功能,并由此导致很多人的困扰,特别是一些2D游戏创作者,人家只想要图片原始色彩。

下图是Tone Mapping前后的对比。

实际上tone mapping自古以来一直都有,不是计算机图形学的专利。早期因为颜料的对比度有限,达芬奇等的高手会把需要表达的内容用很有限的颜色画出来,即便色彩不真实。而刚发明电影的时候,胶片能表达的亮度范围有限,所以摄影师会把高亮区域和阴影区域向中等亮度方向压缩,发展出了S曲线的映射关系。

正文

UE4中使用的电影色调映射器符合学院彩色编码系统(ACES)为电视和电影设置的行业标准。这确保在多种格式和显示器之间保持一致的颜色,同时作为将来证明源材质的一种方法,因为不需要为出现的每个介质调整颜色。电影色调映射器也使用与先前在UE4中使用的相同的全局色调映射器,现在除了能响应S曲线形状外,现在能更好地支持模拟胶片整体效果。

演示一下一张图片在默认情况下在UE4中的显示。版本是4.26.1,新建一个空白场景,导入一张包含几个纯色及一张动漫头像的图片,如下图:

1、UMG显示

创建一个UMG,例如命名为WBP_Composure。直接把这张图片贴上去,并全屏显示出来。

运行后,可见颜色没有任何改变,完全还原。

2、UMG场景显示

把上一步的UMG放进3D场景里看看。

创建一个actor,增加Widget组件,指定为WBP_Composure。

然后把这个actor拖到场景里。

背景绿色变亮了,白色变暗了

这时如果我们试试直接关闭tone mapping,控制台(~键)执行:ShowFlag.Tonemapper 0

关闭tone mapping后,色彩与原图片接近了,但背景绿色依然比原图亮些,而且太阳光晕也消失了

可见简单的关闭tone mapping并不能解决这个问题。另外需要注意,此命令会影响整个工程项目的所有关卡,操作之后记得还原ShowFlag.Tonemapper 1

还有种方式是修改film tone mapper,执行r.tonemapperfilm 0,效果比较不错。

关闭film tone mapper,色彩亮度接近原图,太阳光晕也在

后记

这篇文章其实并没有完全解决这个问题,我对材质的了解只能算是一知半解,将来有更好的方法时再来完善。

UE官方论坛上有很多人在讨论类似的问题,从2014年就开始了,至今也有人跟我一样在挣扎。还有SRGB、Linear之间的转换等问题。如同某个楼主所说:“It took me a long time to find it. Either people are not using unreal engine to make pixel art games or people dont notice their pixel art looks wrong.”UE的出发点是好的,但却给不少人带来了长期的困扰,希望将来会改进吧,通过增加一些简单的选项或提示。

引用

留下评论