同样作为次时代的代表性渲染效果,我个人觉得HDR比运动模糊和景深更具有实际意义,也更值得咱们为其消耗资源。
概念:由于人眼能分辨的最大亮度差为100000000 :1,即使是同一个场景也能分辨10000 :1,但显示设备只能创建的亮度动态范围是100 :1。对于目前来说,图片的存储能力已经能够做到存储最大亮度差,但是却正是由于设备的原因无法在显示器上正确现实。从这点可以看出HDR不是实时渲染特有的,而是所有涉及图像现实领域都需要面对的一个需要解决的问题。
由此可知HDR是一项为了解决亮度差问题的技术,而这项技术的重点就是为图像上的每一个像素点做亮度差的映射,把图像本身的亮度差比缩小到100 :1的范围。所以,这项技术原理很简单,关键是这个缩小比例的映射算法,如何让一张真实亮度的图片在保持原有色感的基础上实现缩小亮度比。
映射算法:
1.全局色调映射算法 :
其实就的对整张图像的所有像素,按照固定比例对其亮度值进行缩放。这种方式是个人都知道怎么实现,例如你的图片最高亮度比是100000000 :1,那么你就让所有像素的亮度值都缩小1000000倍,当然这只是个例子,如果这样做肯定是傻×,这图像就没法看了。这类算法中有两个比较有名的算法:
(1) 对数方程的调色映射算法 :就是用一个特点的对数方程来获取缩放比值,这样这个值就不是固定的了。
(2) 直方图均衡化的色调映射算法 :这个更深奥一点,但是类似都是按照一种固定的规则进行获取缩放因子。
全局映射算法的缺陷就在于它不关系图像具体情况,所有图像都按照统一的规则,这种方式下的产物肯定是不会太好的。优点就是效率高,但我不觉得这是优点,因为啥都不做效率更高。
2.局部色调映射算法 :
相对于全局来说,这类算法考虑了局部的因素,所以在效果上也比全局好一些。
(1)分层色调映射算法 :这种方式就是把亮度值 = 反射分量*明度分量,把亮度分成两个值来描述。而其中反射分量是与材质和纹理相关的值,貌似算法使用了高斯滤波来提取这个分量,然后剩下的明度分量按照全局来处理。其实我觉得这个跟全局算法差不多,只不过考虑了材质和纹理。但是,滤波的时候有信息损耗,还有这方法效率高不了。
(2)梯度域的色调映射算法:这个算法的原理是,图像中亮度变化较大的区域具有较大的梯队,而图像的细节部分例如纹理具有较小梯队,这样大的梯队减小的越多,小的梯队反而有可能增加。通俗的说就是亮度变化比较快的区间就把这个区间的亮度缩小的多一些,而亮度变化不是很大的区域,反而适当增大。这种方式是不错的,个人觉得比上面的好。
3.多分辨率与全局结合算法:
此算法是先用全局算法统一处理,把亮度压缩到100 :1,然后用伽马算法进行修正,再然后就是对强光部分进行高斯模糊。个人觉得这其实就是全局算法,只不过后面增加了伽马修正和高斯模糊。伽马修正和高斯模糊前面的算法都可以有的。
但是这个压缩亮度的全局算法与上面说的两种不同。
(1)计算光强度 :L(x,y) = 0.27*R + 0.67*G + 0,06*B (这是一个像素的强度值)
(2)计算平均光照强度系数 :6是一个比较小的值,主要是为了计算log2,这里也可以为log别的
(3)缩放后光照强度 :目标强度值 = a * 原强度值/平均光照强度系数。a值调整明暗度,a越大越亮。
(4)映射的光强值 :
(5)伽马修正 :y = 2.2
(6)高斯模糊 :高斯模糊算法是使用高斯函数对图像做卷积(略)
总结 :最后一种方式不错,高斯模糊算法到网上找一下。