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的结果相加即得到最终的结果。
至于得到特殊的效果,需要仔细调整曝光度以及一些参数。