让游戏更真实——HDR技术解析
技术大讲堂
HDR是近段时间以来极为热门的一个名词,显卡厂商NVIDIA和ATi都在竞相宣传自己的显卡对HDR的支持如何良好,游戏厂商也都以游戏支持HDR为荣,而玩家更是把HDR看作技术领先、画面优秀的代名词。那么HDR到底是什么呢?
什么是HDR
我们通常所说的HDR实际上是High Dynamic Range(高动态范围)的缩写。这个词不仅可以用在图形领域,在很多场合都是可以应用的,而且它是一个相对的概念。比如,在撒哈拉沙漠上,日间温度是55℃,但是晚上温度可能会降到冰点,这里的动态范围就是55:1左右,而电脑机房的温度都比较恒定,一般是1:1,此时我们可以说沙漠上的温度动态范围是HDR,而电脑机房则是LDR(Low Dynamic Range)。
而我们这里要讨论的是图形领域的HDR,它主要指的是光亮度的动态范围。在现实世界中光亮度的动态范围是极高的,比如太阳光的动态范围就是100000:1,而我们平时使用的显示器、照相机、打印机都只能显示其中的一部分,它们的动态范围都相当之小,甚至不到1000:1。但我们人类的肉眼所能分辨的动态范围却是超乎想象的大,于是为了能更真实地在显示器、照相机、打印机等设备上表现光照效果,HDR就成了很重要的研究课题。

HDR在游戏中的应用
HDR在游戏中可以具体阐述为:高动态光影效果。HDR在游戏中可以表现出怎样的效果呢?我们在早期的HL2宣传影片中可以看到一个相当典型的HDR效果应用:在一间昏暗的房间顶棚上有若干个天窗或孔洞,阳光直射进来,天窗或者孔洞的周围就会出现泛光的现象,这一范围内会出现很多鲜明生动的色彩。旁边物体的光线也会比房间其他地方要更亮。这就是一个“泛光”的现象。除此以外,根据光线和物体位置的不同也会出现“星光芒”、“散射”等现象。如果游戏中可以做到这种效果,那么游戏的画面真实感就会大大增强,这也是近来游戏大作都在追求HDR效果的原因。

FarCry 1.3中开启HDR后的效果对比,下方是有HDR特效的画面,和上方不具有HDR特效的画面相比,明显可见更多的细节。
请注意上述“泛光”、“星光芒”、“散射”等现象都是人眼看到的效果。这是因为眼睛会对我们看到的亮度做出调节,虹膜不断地受到周围光源环境的影响,从而促使瞳孔扩张或收缩,使眼睛始终处在一个能接受所见景物最高亮度和最低亮度之间的一个平衡点上,并会不断随环境变换而做出调节。在视觉区域中,和这个平衡点相距甚远的色彩区域则不会表现该点的细节,而会和背景以及光线在大气中的折射产生丰富的色彩范围,于是,泛光和其它视觉效果便出现了。也就是说游戏中的HDR的主要作用之一就是模拟人眼面对高亮度的一些生理特征的反应。除此以外,游戏中的HDR还应该发挥另一个重要作用,应该让亮部和暗部都呈现出比较清晰的细节。换句话讲,如果一款游戏对HDR的支持不够好,那么在亮部和暗部则分辨不出更多的细节。

在FarCry1.3开启HDR特效的室内场景中,明亮的阳光从室外射进来,在窗栏上形成了耀眼的“光带”,这正是我们日常在这种情形下最容易看到的景象,相当真实。
在不支持HDR的游戏中,每个像素储存的只是颜色的信息,或者只是在游戏中会出现的一些表面、网格信息。模型被光源照亮的程度只会由渲染器简单提升或者降低像素的色彩亮度以表达这个像素是否处在光照环境中,而和周围的环境是没有任何交互,真实的高光以及泛光效果自然不会被反映出来。在HDR技术中,像素被赋予亮度参数,色调的计算采用了浮点精度,因此,光源强度不再仅仅限于黑白两色和灯光颜色的混合,Alpha通道的运用丰富了色彩的输出层次。当然,在渲染器引擎中,色彩范围的增减还是要依靠像素被照亮的程度来进行模拟。
HDR的实现
从上文可以看出HDR的确是很有用的图形渲染技术,那么它是如何生成的呢?这要追溯到上个世纪80年代。那时的HDR主要是非实时处理,它的方式主要有两种,一种是以连续的自然光谱为基础进行的HDR渲染;另一种是收集图像在各种亮度条件下的数据,最后再进行合成。这些方法主要用来处理图片,尤其是后者还是目前进行HDR图片处理的主要方法之一。
游戏中则主要是动态HDR渲染,上述的静态例子自然是不适用的。要了解动态HDR渲染,我们要先来了解一下色彩精度的概念。到目前为止,计算机所能使用的最高的色彩精度是32位。32位整数的范围是0到232-1=4,294,967,295,超过了40亿种色彩。但这仍然不够,首先,32位色彩并不能真正使用40亿种色彩。事实上,只有24位被用来表示“RGB”(红绿蓝)色彩信息。剩下的8位通常携带的是“Alpha”(透明)值。224只有16,777,216,这就是我们通常知道的“True Color”(真彩色,1670多万种颜色)。到此为止,这个数字看起来还不错。然而,让我们再仔细看看,就会发现32位色彩也不怎么动人。24位可以表示的色彩信息是由8位红色,8位绿色,8位蓝色组成的。这意味着每一种基本色彩都只有8位的精度,范围只有0到255而已。这真的是不够用。每个色彩信道仅8位的精度带来一个严重的缺陷,它不能支持完全的动态范围,这个值到最大值的动态只有255而已,更不要说什么高动态了。而在图形处理极为复杂的游戏中,8位信道的精度是绝对不够的,这是因为定义颜色的数值会在运算过程中发生变化,产生不同的中间数值。而谁也无法保证这些中间数值会是256种颜色值中的一个,在出现非整数的中间颜色值并需要存储时只能进行取整操作。经过多次取整操作,累积下来的误差足以导致图像色彩产生致命的失真甚至被丢失。具体到游戏中表现出来就是细节的丢失,画面的过曝和HDR无法实现。


在FarCry1.3中,室外场景上使用了HDR特效后(右),水面的阴影效果更为明显,层次感更为丰富。天空更加亮丽、立体感加强,而且隐约有阳光从云层中透射出来。
所以程序开发人员考虑到了浮点数。在现今的计算机里,有两种操作数字的方法。最容易理解的当然是整数了,它们自然存放而已,而浮点数则完全不同。这里的数字由一个符号位、一些指数位及大量的字位构成尾数。计算公式是x=m*2e,这里x是数字,m是尾数,e是指数。浮点数的最小和最大值都是由指数决定的,而尾数则决定数字的精度。
以128位浮点数为例,每个色彩信道也有32位的浮点精度,这是整数操作所不可想象的,而它给图像质量带来的是质的飞跃。高精度浮点使得色彩不会在运算过程中失真或丢失,高精度浮点数也为HDR的实现提供了可能。

小知识:目前NVIDIA的显卡支持16位和32位浮点精度,而ATi的显卡支持24位的浮点精度。当然显卡支持浮点精度只是支持HDR运算的一个必要条件,还有许多硬件特性的支持也决定着显卡到底能够完成什么程度的HDR,这是因为根据HDR使用的数据不同,编码方式不同,HDR实现的具体方法和复杂程度以及最终效果也有很大的差异。目前公认的是NVIDIA的NV4x系列显卡所使用的OpenEXR浮点渲染操作是家用游戏显卡中最为先进的一种。
HDR的处理过程大概分为四步,第一步使用浮点精度数据对原始的图像信息进行渲染取值;第二步对渲染目标取样并转化为LDR(低动态范围)值;第三步对取样结果进行水平和竖直方向的模糊过滤;第四步将过滤处理后的图像和原始的高动态大范围图像信息混合得到最终渲染结果。
NVIDIA采用的OpenEXR就是在这个过程中使用的缓存数据格式,它是由Industrial Light and Magic(简称ILM)开发的,支持16位浮点、32位浮点以及32位整数格式,已经有相当丰富、成熟的函数库。而GeForce 6800 Ultra提供的是OpenEXR的16位浮点(FP16)贴图、过滤、混合、存储支持,NVIDIA对此起了个名字——HPDR(High-Precision Dynamic-Range即高精度动态范围)。这种方式在图像质量和资源消耗上取得了一个很好的平衡,不过目前采用HPDR 的时候不能支持抗锯齿效果。著名游戏FarCry1.3版中的HDR效果就是采用OpenEXR方式实现。

而ATi的显卡在HDR硬件支持上稍显落后,很多操作都需要像素渲染来支持,所以在效率上和游戏厂商的支持力度上要差一些。因此ATi还专门在X850显卡推出时使用FarCry的引擎制作了一个包含HDR的实时DEMO来证明自己显卡的HDR运算能力(X800的RUBY DEMO也有HDR特效存在,而R3xx和R4xx的HDR实现原理基本是一样的)。
类似HDR的特效
由于HDR的确是一种先进而有效的图形特效,所以在目前支持HDR游戏不多的情况下,出现了两种比较有意思的情况,一种是简单地认为游戏中的高光效果就是HDR,其实不然,有很多都是使用DirectX技术产生的Bloom(强光散射)特效。Bloom也是一种很不错的图形特性,它是通过在原图上累加模糊光线效果获得的。甚至可以说它和HDR在最终效果上有很多类似的地方,它同样可以使得非常亮的表面产生高光效果,导致强烈的反射效果,周围原本灰暗的地方则由于发散的光线而被照亮。但Bloom毕竟不是HDR,在亮处和暗处的细节以及全屏画面细节上它都比采用HDR的画面要差很多。Bloom曾经在3DMark03中被大量地使用,产生Bloom效果只需要显卡支持DirectX7即可,在考虑资源消耗和显卡支持的情况下,Bloom在目前的确是不错的HDR替代品。

另一种现象则出在狂热的程序员身上,他们开发出种种附加程序,使DOOM3、HL2等游戏可以实现类似HDR的效果,甚至也可以在CS、《魔兽3》中实现类似HDR效果,得到了不少玩家的追捧。

小结
对于HDR技术,目前在游戏中应用的实际状况是大多游戏采用sRGB方式来实现“HDR”效果,虽然它能够支持纹理过滤、色彩混合,消耗的像素渲染运算资源也不算多,但是它的动态范围很小,仅有OpenEXR方式的四分之一稍强,游戏中产生的效果并不理想。真正使用HDR的游戏屈指可数,并且这些真正使用HDR技术的游戏对HDR的使用还称不上成熟,具体表现就是HDR使用有些过滥,很多物体的高光表现都被夸张了。但我们不能否认无论硬件还是游戏,对HDR的支持都已经走上了正途。上面的现象只是使用HDR的初期,兴奋过度是出现的小小混乱罢了。在未来,HDR必将成为游戏制作中的一项重要图形技术。