图形 2.7 LDR与HDR
LDR与HDR
基本概念
我们为什么要使用HDR?(因为HDR好看,对,HDR真的好看,可惜不敢在手游项目上乱用这个玩意。)因为HDR有更好的色彩,更高的动态范围和更丰富的细节,并且能有效的防止画面过曝,超过亮度值1的色彩也能很好的表现,像素光亮度变成正常,视觉传达更加真实。
HDR才有超过1的数值,才有超过1的数值,才有光晕(Bloom)的效果,高质量的Bloom能体现画面的渲染品质。
Unity中的HDR
调整Camera的HDR选项。开启的话,Camera会将场景渲染为HDR图像缓冲区,然后进行屏幕后处理:Bloom&Tonemapping。Tonemapping会将HDR图像再转换回LDR,最后再将LDR图像发送回显示器。
URP自定义渲染管线将场景渲染为HDR图像缓冲区,进行屏幕后处理:Bloom&Tonemapping。Tonemapping转换回LDR,最后把LDR图像发送回显示器。
shader中为color变量加上[HDR]属性前缀,可以将拾色器变为HDR拾色器。HDR拾色器多了一行Intensity配置。使用Intensity滑条可以调整颜色强度,滑动条每增加1,则提供的光量增加一倍。
HDR的优点:
- 滑动条每增加1,则提供的光量增加一倍
- 减少画面较暗部分的色阶感
- 更好地支持Bloom
HDR的缺点:
- 渲染速度较慢,需要更多的显存 ,这里增加了Tonemapping的操作
- 不支持硬件抗锯齿
- 部分手机不支持
HDR与Bloom
HDR和Bloom的区别是常考题呢(
HDR制作的出的效果其实Bloom制作的效果相差不大,但是它们使用技术却大相径庭。HDR效果本质是比1更亮的颜色和比0更暗的颜色的结合,这个效果是光照计算自然产生的,强度、颜色等方面是游戏程序可动态控制的;bloom效果则是物体本身发出的光照,仅仅是将光照范围调高到过饱和,是游戏程序无法动态控制。
bloom的本质实际上是将画面中较亮的颜色(用程序规定什么是较亮的颜色)提取出来进行高斯模糊,然后再和原图叠加。这个效果无需HDR就可以实现,而且不受显卡的规格限制。但是这个效果非常受限制,因为bloom无论怎样还是只有8位通道,而HDR最高能支持到32位RGBA。
不过事实上unity的流程会有点不一样,会在第一步down sample(降采样),然后高光像素不同的down sample并保存在RT到一定的次数(这个次数由参数控制),再一步一步up(上采样)回去。而在up回去时会将之前的down sample加入每步对应的up sample至回到原来的分辨率。
HDR与Tonemapping
之前提到我们最终要把渲染出的HDR图像最后转回LDR来输出到屏幕上,这个部分使用的技术就是Tonemapping,也就是色调映射。色调映射算法就是指对图像颜色进行映射变换的算法,调整图像的灰度,使得处理后的图像人眼看起来更加舒适,能更好的表达原图里的信息与特征。
如果直接线性映射回去会怎样:
可以发现映射回去的图像完全不符合哦我们的预期,因此我们需要采用一种非线性的方式来进行映射,比如ACES曲线。
ACES曲线是指Academy Color Encoding System学院颜色编码系统,是最流行、最被广泛使用的ToneMapping映射曲线,它能很好的保留暗部和亮部的细节,也可以之后在这个基础上再进行调色。
其他ToneMapping曲线:
- 2002年 Reinhard Curve
- 2007年 CE Curve
- 2010年 Flimic Curve
LookUp Texture
LookUp Texture,LUT。在Color Grading的All None模式中有LUT,简单说就是滤镜。但是LUT与Tonemapping不同,LUT在LDR之间做变换,而Tonemapping是在HDR做变化。调整rgb三个通道的LUT被称为3D LUT,格式有3DL、CUBE、CSP、ICC配置文件。
扩展作业
IBL在HDR和LDR上的区别?
IBL,指基于图像的光照(Image-Based Lighting)。即将一张作为环境贴图的CubeMap来作为光源,以实现物体融入环境的效果。它和之前我们在传统经验光照模型中手动设置环境光有很大不同,使用CubeMap来作为光源可以看作一个小的球体包裹了这个场景,球面上的所有方向都有光线传来,因此我们要考虑球面上的所有方向来得到一个真正的积分结果。
而在先行版的PBR中使用IBL有个需要注意的地方,我觉得需要从能量守恒的角度来考虑,即光照中能表示光照强度的量。因此在HDR和LDR上的区别应该从这个方面来考虑,比如太阳光这种强烈的光,HDR会试图保存它的HDR颜色来表现光照强度,但是LDR中这个光照强度会被截断成1,这样我们这部分的光线能量就会损失掉,自然也就违背了能量守恒。那么被LDR截断成1代表着什么呢,意味着最后我们损失了一部分的光线,导致的结果自然就是场景会变的更暗。也就是说相比于HDR,LDR非常不适合用来还原光照环境,这样的环境贴图单纯用于视觉输出还可以,但是用在PBR环境光的输入参数上就会造成错误的效果。
左边为HDR探球,右边为LDR探球
开启Bloom,对比更加明显
参考