1 什么是HDR
HDR是High-Dynamic Range的缩写,实时渲染中称之为高动态范围光照渲染,是一种表达超过了显示器所能表现的亮度范围的图像映射技术。
2 为什么要用HDR
通常,显示器能够显示RGB分量在(0,255)之间的像素,也就是我们最终呈现在显示器上的backbuffer format最多只是R8G8B8,每个通道8bit, 这样能够表现出的明暗对比度是非常有限的。如果我们直接渲染到这样的back buffer上用于最终的显示,对于明暗对比度很大的场景就会丢失很多细节,亮的部分就会表现为全白,而暗的部分又会显示成全黑。
HDR渲染技术就是为了解决这一问题,它根据场景的明暗对比, 把HDR高动态范围光照非线性的ToneMapping映射到显示器能显示的LDR低动态光照范围,尽可能的保存了明暗对比细节,使最终渲染效果更加逼真。
3 怎样实现HDR
HDR一般分为如下几步,
1) 把整个场景利用RTT渲染到一张浮点纹理上。
2) 利用Tone Mapping, 把HDR的浮点纹理映射到LDR的BackBuffer上。
关键步骤其实就是如何进行Tone Mapping,下面介绍两种Tone Mapping算法。
在算法中都用到了亮度的计算,每个像素的亮度的计算方法是L=0.27R+0.62G+0.06B
4 Tone Mapping 算法1
基本原理是把亮度线性的映射到(0,1)的范围,公式如下:
其中L是当前像素的亮度,Lmax和Lmin分别是图像的最大亮度和最小亮度。
5 Tone Mapping 算法2:
1)通过如下公式计算平均亮度。
2)利用如下公式计算缩放因子。
其中L(x,y)是当前像素的亮度值。Key是一个常数,Key 的大小决定了映射后场景的整体明暗程度,一般取0.18。假设在LDR表面(电脑显示器)全黑为0,全白为1,在0和1之间有9个过渡灰度,中间第6格灰度值为0.18,把HDR场景的平均亮度映射到第6格,其意义在于使LDR中等亮度与HDR的平均亮度重合. 当然可以根据场景的情况使用不同的Key值,Key值越大,最终结果就越偏白。
3)计算当前像素最终颜色值。
其中Color(x,y)是当前像素的颜色值。
该算法便是Direct SDK 中的HDRPipeLine Sample中使用的算法。当然,除了Tone Mapping之外,Sample中还添加Bloom后期处理来达到光晕的效果。
转载于:https://www.cnblogs.com/cxrs/archive/2013/03/22/HDR%e9%ab%98%e5%8a%a8%e6%80%81%e8%8c%83%e5%9b%b4%e5%85%89%e7%85%a7%e6%b8%b2%e6%9f%93.html