URP | 后处理-色调映射-ACES
内容偏多这是目录

目的
什么是Tone mapping ? 什么是ACEs?
使用ACEs 有什么好处?为什么怎么使用?
效果

色调映射
Tone mapping
Tone Mapping原是摄影学中的一个术语,因为打印相片所能表现的亮度范围不足以表现现实世界中的亮度域 , 而如果简单的将真实世界的整个亮度域线性压缩到照片所能表现的亮度域内,则会在明暗两端同时丢失很多细节,这显然不是所希望的效果,Tone Mapping就是为了克服这一情况而存在的.
既然相片所能呈现的亮度域有限则我们可以根据所拍摄场景内的整体亮度通过光圈与曝光时间的长短来控制一个合适的亮度域,这样既保证细节不丢失,也可以不使照片失真
这里有两个关键 ,
光圈大小
曝光时长短。
到了计算机图形学发展的时代,最早只有LDR,颜色就是0-255。这个情况一直持续了很长很长时间。 为了让图像更真实的显示在显示器上,同样需要Tone Mapping来辅助。
URP Tone mapping
URP是线性空间,游戏在多光源渲染过程,颜色信息有的超过 0-255的范围。 就称之为HDR模式,我们显示器默认显示的是LDR,LDR也就是 颜色范围是 (0-255)
使用游戏渲染过程中产生HDR的画面。需要映射到LDR的设备上,就需要转换的过程(tone mapping),就是Tone mapping。
URP默认Tone mapping

URP默认给我们提供了 2种默认的
Neutral
ACES
原理
过程就是首先要根据当前的场景计算出场景的平均亮度,再将整个场景映射到这个亮度域得到正确的结果。
Middle grey : 整个场景的平均灰度,关系到场景所应处在亮度域Key:场景的Key将决定整个场景的亮度倾向,倾向偏亮亦或是偏暗。
[参考]Tone Mapping---色调映射算法_one_u_h的博客-CSDN博客
下图是处理过程流程图

曝光
当人眼观察一个场景时,眼睛会自然扩张以适应到达它的光量。 上面我们说到摄影使用光圈大小和曝光来控制曝光获取场景光的大小。
曝光是以模拟实际光照射到传感器的光线多少,避免光线过多或过少。
渲染画面我们也需要获取场景的曝光值,使用曝光值来控制场景
这里使用
近似的ACES拟合曲线由Krzysztof Narkowicz
[参考] ACES Filmic Tone Mapping Curve | Krzysztof Narkowicz (wordpress.com)
这里由我们来控制输入的曝光值的大小,默认 0.6
算法
拟合曲线
曲线


URP实现过程
思路
我们实现基础的后处理管线计算,
制作后处理组件调节属性。
核心计算使用Shader类计算,Shader在给到后处理。
Shader
色调映射矩阵
整个场景的色调
把我们输入线性颜色映射到 ACES
在进行gamma校正
全代码
注意:ACESFilm是float3类型
Volume
后处理组件属性很简单
效果

注意:曝光值是0.6
RenderFeature
URP | 后处理-自定义后处理 - 哔哩哔哩 (bilibili.com)
URP | 后处理-模糊算法总结 - 哔哩哔哩 (bilibili.com)
主要是绑定 Shader属性,具体不清楚增加看前面的后处理
设置RT
注意:设置可以储存HDR模式
代码

效果对比
自定义和系统默认
这是默认线性模式,没有进行Tone Mapping
颜色爆,亮部看不到细节

Unity 默认 ACES

自定义ACE

增加饱和度
如果我们感觉颜色饱和度还是不够,我们可以调整饱和度。

总结
Tone Mapping 是色调映射的方式,需要把高动态颜色范围(HDR)映射到低动态颜色(LDR),我们渲染出来的颜色范围是大于 [0-1]的,我们需要映射到[ 0-1]的范围。
ACES 是 映射方式其中比较好的算法,目前大部分是使用这个算法。
在Shader 计算不同颜色映射比较复杂,需要转换俩次,计算一次是线性颜色转换成ACES颜色,第二次是进行Gamma校正输出到屏幕。
色调映射 ----图像颜色进行变换的算法
[参考]Tone Mapping---色调映射算法_one_u_h的博客-CSDN博客
决定整个场景的亮度倾向,倾向偏亮亦或是偏暗。

应用ACEs 模式

后置处理,颜色重构
