相当于美颜相机,加滤镜。
做后处理的目的:
- 物理正确。让画面正确地被曝光。相机拍照的时候,整个光强变化的幅度是非常大的,太阳光可能是烛光的几亿倍。正确地被曝光,才能产生我们想要的效果(光晕)。
Bloom 光晕
为什么会有光晕?
- 不是完美的小孔成像,不能完美地聚焦在焦平面上,就会产生 Airy disk。
- 另一种,晶状体有半透明材质,像气溶胶 ,迎着光的方向有极向的反射。
首先把高亮的地方取出来,亮度可以从下面算:
当亮度超过某个阈值的时候,例如 1(不一定正确,用平均光场强度算会更好一点),取其强度和颜色。
然后做 Blur。这个 5*5 的 Blur 可以通过两次五个像素的卷积。
对每个点,第一个 pass,对上下相邻像素合一起。
第二个 pass,把第一个 pass 的结果左右合一起。
这样合一起的结果,相当于对每个点周边 25 个像素全部取一遍的结果。
对于 9*9 的卷积核,本来要卷 81 个数值,这种方法只用卷 19 个数值。计算量会少很多。
得到 Blur 的区域后,这个区域其实是不够大的。因为真要实现上图右边朦胧的效果,需要三四十个 Kernel。
因此我们可以用 Pyramid 方法。
down sample 后,对最低一阶进行 Blur,再一级级放大回来,再进行加权混合。
其中混合有权重,到底是原图和 Blur 各 0.5,还是其他的比例,每一家公司都是自己设的,甚至还可以开放给艺术家。
计算量远远小于对最大的图进行超大的 Blur。
这个思想在图像学也很常见。后面会有 half resolution,mid 的方法,都是降低复杂度的算法。
Tone Mapping 曝光
大礼堂里面,白天窗户会非常亮,进去会发现窗子看的很清楚,里面的东西也能看得很清楚。
但如果掏出手机拍照,就会发现里面的东西看得很清楚,但是窗户那边已经曝掉了。要么就是窗户看得很清楚,里面看得很黑。
因为真实世界的光照的 range 是非常大的,如果曝光没有仔细调过,要么就是亮度过亮,要么就是暗部过暗。
现在游戏的渲染,基本都是 HDR 的渲染,光直射的地方非常亮,阴影里面亮度非常低。
如果我们不用一条曝光曲线把这么大范围的亮度数据映射到 LDR 或 SDR 上,就会是上图左边的图,天空已经过曝掉了,出现了色偏(亮度超过 1 的截掉,HDR 会产生色偏)。我们需要 Tone Mapping 使其曝光对。
差不多就是把 0~40 的值映射回 0~1。
Tone Mapping 的映射曲线有很多。随着行业发展,最经典的曲线,就那么几条。
Filmic
名字起的太厉害。曲线能让游戏产生电影的画质,顽皮狗提出。
算出任何一个点的光强后,要算出新的映射的时候,变成纹理进行采样,好像效率有点低。
因此他们实际上是用多项式的拟合来做的 Tone Mapping。
float3 F(float3 x) { const float A = 0.22f; const float B = 0.30f; const float C = 0.10f; const float D = 0.20f; const float E = 0.01f; const float F = 0.30f; return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; } float3 Uncharted2ToneMapping(float3 color, float adapted_lum) { const float WHITE = 11.2f; return F(1.6f * adapted_lum * color) / F(WHITE); }
现在行业中慢慢在切的是 ACES。
ACES - Academy Color Encoding System
美国电影协会,结合多年经验提出了这个曲线,还解决了非常厉害的问题。
我们渲染出东西的时候,实际上需要在不同设备上播放,例如 HDR 显示器、非 HDR 显示器,最后颜色怎么映射?人眼对颜色的感知都是相对的,比如一个绿色在打印的白纸上,和在电影院里黑暗的环境中,要感知到一样的绿色,其实这两个颜色是需要调过的。
曲线调过颜色之后,还能加一道工序,无差别地适应到各种各样的现实终端。
ACES 为的是解决所有设备之间的颜色空间转换问题。所以这个 tone mapper 不但可以用于 HDR 到 LDR 的转换,还可以用于从一个 HDR 转到另一个 HDR。也就是从根本上解决了 VDR 的问题。这个函数的输出是线性空间的,所以要接到 LDR 的设备,只要做一次 sRGB 校正。要接到 HDR10 的设备,只要做一次 Rec 2020 颜色矩阵乘法。Tone mapping 部分是通用的,这也是比之前几个算法都好的地方。
目前一些新的游戏,比如 Rise of the Tomb Raider、UE 4.8,也都切换到 ACES 的 tone mapping 曲线。
所有的数值、曲线都是由大量视觉艺术家调效果的。
上图显示了同样场景,用不同曲线曝光。
Color Grading 调色
彻底的“美颜”。
现代游戏中非常重要,非常简单,对游戏效果有质的飞跃。
善于表达清晰,例如打 Boss 非常难打,可能会发现色相偷偷的在变化。
Color Grading 又有种叫法叫 LUT,本质上是原始颜色和想调到摄像空间的映射,这个表格就是下图中的样子。
给一个颜色,变化到另一种颜色。
早期一些硬件不支持 3D Texture,我们就将其拍平为 2D Texture,一样存 Shader 里面。
我们不需要存 ,太大了。实际上、 就够用了,因为颜色是连续的,在两个值之间插值即可。
非常实用,因为写完之后,其他的都可以交给艺术家发挥。
例如 PS 里面,艺术家可以方便自己调各种想要的效果,插件还能导出 Color Grading 的 LUT。
Color Grading 是游戏引擎里面性价比最高的功能,非常简单,对游戏效果有质的飞跃。