http://blog.csdn.net/toughbro/article/details/6755394

bungie 06年,gamefest上的paper。

全文讲的比较系统,有空的话还是看原文的比较好,这里摘录一些我觉得很不错的部分。

补上微云链接:http://url.cn/I4SYbF

Why HDR?

为什么要hdr?简而言之就是更加真实,相比之下LDR失真的地方很多,进而影响了沉浸类游戏对玩家的代入感,

具体到实际的好处,列了这么几点:主要集中在范围和细节的保持上

  • 让我们进一步感受游戏中的明亮
  • 更好的bloom,glare,
  • 自动调节曝光,使得根据屏幕亮度情况可以做到最大程度的保持细节
  • 在blending的时候保持细节
                                                                                                                                                                                                                                       
LinearPipeline
 
需要在linear space做lighting计算,gamma space的问题就是texture读取和输出都没问题,其实如果不做lighting的话,用srgb读texture,在用srgb写render target结果和不用srgb sample texture,不用srgb write buffer是一样的。
问题就是出在shading上,计算lighting的时候如果在gamma space,数学上就不对,就会不完美。
比如:
 
linear pipeline
  • 硬件gamma correct并不是直接做一个pow计算,而是采用一些近似算法,这里有一定的不匹配的状况,
    • 因为在photoshop里和现实的不一致,bungie的artist对此很不爽。
    • 这种情况的处理可以在photoshop中使用相应的gamma 的profile,这样就一致了
  • alpha blending也是可以有硬件支持来做linear space的
    • 不过一直在linear space就好了么
  • render target
    • 理论上是使用dynamic range(ratio of brightest to darkest)
    • 但是实际应用的时候不会这么理想,所以把重点放到usable exposure range比较好
    • 也就是不会产生色阶的exposure range
    • rgbe和rgbm两种encoding方式没有fp16好,但是也不错,只是没有hardware blending
      • halo3的cubemap就是用的rgbm,虽然数学上不全对,但是看起来是不错的
  • postfx
    • bloom和tone mapping都是有curve来矫正的
      • 这里有缺失physically准确性
        • 但是也不能拘泥了,本身像电影等也都是在physical正确的前提下去根据人的感觉来做矫正
这里bloom的处理我觉得比较打开思路,之前工作时候遇见有点束手无策(当时是色阶的问题),bungie就会进行深入分析,找出问题的本质,然后巧妙的一个小技巧就搞定了。
这个很像三体里面的那个小水滴状的东西,在大家不了解它的时候,他处于无敌状态,无坚不摧,在大家了解了它之后,摧毁它却又如此简单。
原本的bloom这样的,可以看见bloom有点过了,暗部那里很不好看,希望可以bloom的更清新:
 
做了bloom curve的结果:
 
其中是对bloom做了这样的矫正:虚线是原来的bloom分布,后面矫正到黄色线那里。
 
这里需要注意的就是,curve是针对亮度做的,不能对color的rgb直接做,那样会改变颜色的:
  1. <span style="font-family:'Microsoft YaHei';">intensity= dot(color, float3(0.3f, 0.3f, 0.3f));
  2. bloom_intensity = bloom_curve(intensity);
  3. bloom_color = color * bloom_intensity / intensity;
  4. </span>

bloom的过程是不停的blur+downsample,然后在up sample回去,得到可以用的bloom buffer。

[ZZ] HDR the bungie way的更多相关文章

  1. HDR the Bungie Way PPT and demo from MSFT

    Gamefest 2006 - HDR the Bungie Way Posted By: Falagard <falagard@hotmail.com> Date: 4/26/07 9: ...

  2. [ZZ] HDR&ToneMapping

    http://blog.csdn.net/toughbro/article/details/6745207 float游戏存储照片blogimage HDR high dynamic range. 很 ...

  3. Bungie Interview with Halo3 Developer

    http://www.realtimerendering.com/blog/tag/bungie/ Digital Foundry interview with Halo: Reach develop ...

  4. [ZZ] Adventures with Gamma-Correct Rendering

    http://renderwonk.com/blog/index.php/archive/adventures-with-gamma-correct-rendering/ Adventures wit ...

  5. [ZZ] Deferred Rendering and HDR

    http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I ...

  6. [ZZ] RGBM and RGBE encoding for HDR

    Deferred lighting separate lighting rendering and make lighting a completely image-space technique. ...

  7. 基于Fast Bilateral Filtering 算法的 High-Dynamic Range(HDR) 图像显示技术。

    一.引言 本人初次接触HDR方面的知识,有描述不正确的地方烦请见谅. 为方便文章描述,引用部分百度中的文章对HDR图像进行简单的描述. 高动态范围图像(High-Dynamic Range,简称HDR ...

  8. 使用FP-Growth算法高效发现频繁项集【zz】

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...

  9. [zz] 基于国家标准的 EndNote 输出样式模板

    基于国家标准的 EndNote 输出样式模板 https://cnzhx.net/blog/endnote-output-style-cnzhx/ 发表于 2013-05-26 作者 Haoxian ...

随机推荐

  1. oracle 10g 学习之函数和存储过程(12)

    一.函数 1. 函数的 helloworld: 返回一个 "helloworld--!" 的字符串 create or replace function helloworld re ...

  2. poj 1753

    翻转棋,注意是翻转周围四个的,不是整行列的  汗-_-! 哥的代码风还是不错的 二进制储存状态 Sample Input bwwb bbwb bwwb bwww Sample Output 4 #in ...

  3. BZOJ 1821 JSOI2010 部落划分 Group prim

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  4. c++工程vs导入工程时发生LNK1207

    I have installed VS 2012 , but i have VS 2010 also. After I open  VS 2010 projects with VS 2012 and  ...

  5. Python开发的10个小贴士

    下面是十个Python中很有用的贴士和技巧.其中一些是初学这门语言常常会犯的错误. 注意:假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5 ...

  6. JNI,NDK

    jni的调用过程 1)安装和下载Cygwin,下载Android NDK 2)在ndk项目中JNI接口的设计 3)使用C/C++实现本地方法 4)JNI生成动态链接库.so文件 5)将动态链接库复制到 ...

  7. 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)

    记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...

  8. [转载]有了 malloc/free 为什么还要 new/delete ?

      malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.他们都可以用于申请动态内存和释放内存.      对于非内部数据类型的对象(如类对象)而言,光用m ...

  9. DOM对象和JQuery对象

    1.JS对象转化为Jquery对象 Var p=document.getElementById(“p”); Var $obj=$(p); 2.Jquery对象转换为JS对象 Var $bh=$(“#i ...

  10. 看病要排队(stl)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...