HDR高动态范围光照渲染

原文链接:http://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

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)的范围,公式如下:

HDR高动态范围光照渲染

     其中L是当前像素的亮度,Lmax和Lmin分别是图像的最大亮度和最小亮度。

  5  Tone Mapping 算法2:

         1)通过如下公式计算平均亮度。

           HDR高动态范围光照渲染

          2)利用如下公式计算缩放因子。

          HDR高动态范围光照渲染

          其中L(x,y)是当前像素的亮度值。Key是一个常数,Key 的大小决定了映射后场景的整体明暗程度,一般取0.18。假设在LDR表面(电脑显示器)全黑为0,全白为1,在0和1之间有9个过渡灰度,中间第6格灰度值为0.18,把HDR场景的平均亮度映射到第6格,其意义在于使LDR中等亮度与HDR的平均亮度重合.   当然可以根据场景的情况使用不同的Key值,Key值越大,最终结果就越偏白。

HDR高动态范围光照渲染

          3)计算当前像素最终颜色值。

HDR高动态范围光照渲染

         其中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

上一篇:java – Spring 4 – HTTP Status 400,不存在必需参数


下一篇:同一路径下jsp能访问到,html不能访问到