bloom, Fake HDR, True HDR(转)

 bloom, Fake HDR, True HDR概念

HDR在我旧网上有说过原理,主要是参考了gamedev上的文章.现在把这几个放一起解释一下.

这些后期处理技术都是为了实现发光特效(glow effect)

HDR, 指高动态光范围,类似于暴光的效果,由于rgb分量在计算机显示

时超出255范围的就被丢弃,所以暴光效果表示不太出来,于是使用了一些

方法来得到这样的效果, 一般常用方法就是把高光找出来模糊后加色混合原场景.

bloom 和 Fake HDR(伪HDR), True HDR(真HDR)原理都差不多,主要是在实现

方法上的不同, 如下所示实现方法:

1. bloom的实现:

   只渲染发出的光芒到一贴图上(例如关掉灯光只渲染自发光物件的光芒)

   然后blur这张贴图

   最后把它用加色混到场景上

2. True HDR的实现:

   读取hdr文件

   将颜色转到64位浮点原贴图中

   将原贴图以1/4大小渲染到downsample贴图中(只取高光,丢弃LDR.即亮度低于1的被过滤掉)

   对downsample进行横向blur然后再纵向blur

   最后将blur与原贴图加色合成并进行tone mapping(调整亮度和乘上暴光指数)就是最终的贴图了.

   提示:

   什么是tone mapping:

     tone mapping指的是对那个可能过亮或过黑image进行rbg值缩放调整(因为最终输出

   的rbg值是不能超出计算机显示范围).

   具体参见hdr教程参见(非常简单,有源码):

   http://www.gamedev.net/columns/hardcore/hdrrendering/default.asp

3. Fake HDR的实现:

   由于真HDR需要SM3.0的浮点纹理支持,所以有人在dx8下作出了伪HDR, 作法是

   将hdr浮点格式转换成16位整形到一整形贴图上,然后再把发光部分抽出来渲染到另一贴图上,

   对它进行blur, 然后用加色方式与第一张贴图混合.

   参考(在fake hdr和true hdr):

   http://www.realistic3d.com/Documents/hdr.pdf

 说白了这种唬人的技术可以用非常简单的方法来实现, 具体可参考dxsdk后期处理例子

 有bloom, glow等效果,  而且可以自己组合(有点象3dsmax那个后期合成), 不过由于多

 遍渲染及相关计算等处理会使速度变慢.

 dx的例子在: Microsoft DirectX SDK (December 2006)\Samples\C++\Direct3D\PostProcess\

  这里有我对该程序的分析:

 http://blog.csdn.net/flipcode/archive/2008/03/18/2194994.aspx

 另外HDR相关可参考phoenixzz的<Something about HDR>解释也比较容易懂:

 他的网站:http://phoenixzz.blogbus.com/logs/1586174.html

 他的解释:

 HDR(High dynamic range) 光照技术是一种近期十分热门的技术,很多最新的DEMO与商业游戏都使用了这种技术,如近期比较流行的帝国时代三与Half-Life2等。由于传统图形学中的纹理颜色表示范围在[0,1]之间,而现实生活中光的范围远远超过[0,1],因此超出范围的光信息就会丢失。由于DX9支持了浮点纹理格式,因此可以支持更大范围的颜色,HDR得以实现。

说到底,HDR实现的根本技术在于浮点纹理格式与浮点绘制表面,A16B16G16R16F 的纹理格式已经足够。其实整数格式的纹理也可以实现HDR,只是需要多费一些事,需要将浮点数表示为整数格式压进整数格式的纹理中。

渲染技术其实很简单,首先将像素结果乘以一个曝光度(一般大于1),这个结果一般会超过[0,1]这个范围,将小于1的部分保存为一个普通的LDR纹理(可以是R8G8B8格式),将超过1的部分保存为HDR纹理(A16R16G16B16F格式);然后对HDR纹理进行BLUR(先水平方向再垂直方向,而且进行BLUR的纹理大小可以是原大小的1/2或1/4,也可以BLUR多遍),最后将LDR纹理与BLUR的结果相加即得到最终的结果。

至于得到特殊的效果,需要仔细调整曝光度以及一些参数。

posted @ 2011-07-18 21:26  oayx  阅读(1826)  评论(0编辑  收藏  举报