zoukankan      html  css  js  c++  java
  • 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的结果相加即得到最终的结果。

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

  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/lancidie/p/2109990.html
Copyright © 2011-2022 走看看