前言
色调映射(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并不能解决这个问题。另外需要注意,此命令会影响整个工程项目的所有关卡,操作之后记得还原ShowFlag.Tonemapper 1
。
还有种方式是修改film tone mapper,执行r.tonemapperfilm 0
,效果比较不错。
后记
这篇文章其实并没有完全解决这个问题,我对材质的了解只能算是一知半解,将来有更好的方法时再来完善。
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的出发点是好的,但却给不少人带来了长期的困扰,希望将来会改进吧,通过增加一些简单的选项或提示。