LDR与HDR
写在前面:
本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。
由于本人水平有限难免出现错误,还请评论区指出,多多指教。
部分图元和素材来源于网络,如有侵权请联系本人删除。
参考资料与链接会在文章末尾贴出。
=======================================================================
1.
LDR表示低动态范围图像,HDR表示高动态范围图像。LDR常见的格式有png,jpg等,比如一张8位图,RGB三个通道灰度值变化范围0-255,即8位图能表示256^3种颜色,看似很多,但实际上远不够来描述我们身处真实世界中的色彩。因此就需要HDR来描述,存储图像,能有更丰富的色彩细节,但HDR并不是一个固定的标准有的是12位,有的是16位等,常见的格式有hdr/exr/raw/tif等。一般我们会把LDR图像通道的值映射到0-1之间,最亮为1,而HDR最亮是可以超过1的。
2.Tone Mapping
由于硬件设备的差异,目前很多情况都需要将HDR的内容输出到LDR的设备上,由此问题来了,我们需要一些方法将HDR图像映射为LDR,此为Tone Mapping。
线性映射
假设下左图中最亮的太阳部分为100,最暗的右下角部分只有5,直接线性映射到LDR下右图,最亮部分为1,最暗部分为0,很明显细节丢失太多了。
下左图为关闭HDR,下右图为开启HDR,左图雪地有明显的的过曝情况,正是因为LDR无法很好表现亮部细节而粗暴的截断了。
因此,为了比较好的映射HDR到LDR大佬们想出了很多算法,比如Reinhard tone mapping,2007年孤岛危机(Crysis)的CryEngine 2自己也搞了一套算法,2010年顽皮狗工作室在神秘海域2上也弄了自己一套算法Filimic,Academy Color Encoding System(ACES)等等。表现效果各有优劣(因为审美是主观的),但 总体上不断在前人的基础上改进,简单粗暴来说,就是把原来的线性映射变成“S曲线”的映射,当然具体曲线怎么变化,公式magic number是多少,算法怎么写更优都是在大佬们在许多项目中研究总结出来的。
有了tone mapping我们可以让画面表现力更上一层楼:
3.bloom
在unity中开启HDR Color,可以将bloom特效的阈值调到合理的值比如1以上才会有bloom特效
各种特效的bloom(辉光?)也更出彩
上图是LDR下的特效,下图是HDR下的特效
参考资料:
1.https://docs.unity3d.com/Manual/HDR.html
2.https://zhuanlan.zhihu.com/p/21983679
3.https://zhuanlan.zhihu.com/p/80253409
4.TA百人计划