[ZZ] HDR the bungie way

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

bufferencoding游戏float算法

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直接做,那样会改变颜色的:

[cpp] view plaincopyprint?

  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。

时间: 2024-11-05 22:52:48

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

HDR the Bungie Way PPT and demo from MSFT

Gamefest 2006 - HDR the Bungie Way Posted By: Falagard <[email protected]> Date: 4/26/07 9:53 p.m. In Response To: New Halo 3 shots (KookyBastard) : Hey guys, I was looking around the Gearbox forums and I stumbled across these : images in the "

[ZZ] HDR&amp;ToneMapping

http://blog.csdn.net/toughbro/article/details/6745207 float游戏存储照片blogimage HDR high dynamic range. 很多程序朋友(包括我)都是从dxsdk上看到和学习这个概念,开始学习的更多的是一整套hdr sample的流程: 在float render target上去render scene 后面很多console上的游戏使用rgbm等编码方式来节省内存和bandwidth 通过down sample去计算亮

[ZZ] Deferred Rendering and HDR

http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I've been reading about people saying "oh you can only do it if the device supports fp16 texture blending" but it's pretty simple to just add to a

[ZZ] RGBM and RGBE encoding for HDR

Deferred lighting separate lighting rendering and make lighting a completely image-space technique. This is very different the forward rendering. At first as the limitation of the hardware, we could make per-object lit by max number of 8 lights at on

没为类型 Node 定义方法 getTextContent (zz)

没有为类型 Node 定义方法 getTextContent (zz) 晚上下班的时候,把班上写了半截的代码带了回来.结果回到家后出乎意料的是回来的时候将代码导入eclipse后,下面这行代码就直接报错了,显示 getTextContent()未定义 . ((Element) ele.getElementsByTagName( "err_code").item(0 )).getTextContent(); 首先想到的是jdk 的版本问题,不可能啊,我昨天才装的jdk 1.6.0_24

Linux 信号signal处理机制(ZZ)

http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后

HDR算法(一)

HDR的图像合成compose,包含有以下几个步骤: Step0 图像配准,在图像有运动的情况下,需要精确配准输入图像 Step1 恢复不同曝光图像 (E1, E2, E3-)的辐射度图像 (S1, S2, S3-) Step2计算S1, S2, S3..的权重值w1(x,y), w2(x,y), w3(x,y),来合成最后一幅图 无论是多帧合成的HDR,还是特殊曝光pattern的sensor,都遵循上面的步骤.展开介绍一下: Step0 图像配准,参照光流的实现,这一步主要是用在多帧不同曝光

海思Hi3516A(4)HDR模式开发

1. HDR概述 HDR(High-Dynamic Range)算法根据不同曝光的图片,合成最终HDR图片,比一般图片具有更宽的动态范围和图像细节. 一般HDR算法有两种:一种是基于不同曝光时间的连续几幅图片合现:第二种是基于同一行不同曝光,最终成一幅图片,这种方法实现简单,只要能调曝光的sensor都可以实合成一幅图片,这种方法需要sensor支持行间长短曝光. 这里使用smartsens公司的SC5035 500万分辨率摄像头芯片实现行间长短曝光实现HDR算法. 2. HDR模式传输方式 在

Unity中HDR外发光的使用

1.使用标准材质,设置好Emission外发光 2.Camera下打开HDR,加上Bloom特效 最终效果 如果只勾选HDR,只会有高光感,不会有外发光 注意,正向光照下打开HDR不可用抗锯齿,否则切为延迟光照