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的结果相加即得到最终的结果。

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

  • 相关阅读:
    活动识别API服务开发
    定位服务API案例
    高精地图定位
    HiCar SDK概述
    HiCar人-车-家全场景智慧互联
    AIoT开放平台及应用
    AI+IoT+电池应用
    智能物联网(AIoT,2020年)(下)
    第一课
    分销
  • 原文地址:https://www.cnblogs.com/lancidie/p/2109990.html
Copyright © 2011-2022 走看看