物理学与计算机图形学中的HDR

前言:HDR技术已经广泛用于离线CG渲染、游戏、电影等方面,能够显著的提高场景的对比度和真实感。可是背后的物理学与数学原理却很少有CG艺术家和图形程序开发人员去关注,非常建议大家阅读此文,通晓其中的基本原理。这不是一篇教你如何在GPU上实现HDR的文章。

引言

  如今大部图形软件都是以24bit颜色为基础,对每个通道占据8bit,以指数运算法则对颜色进行编码。这种方式的优点在于可以和大部分显示器设备兼容CCIR-709标准,也就是我们熟悉的sRGB标准,其Gamma值为2.2。但是这种方式的缺点也显而易见,无法表示位于sRGB范围之外的颜色,而往往这些颜色是那种很亮或者很暗的那种,损失了对比度与动态范围。

  我们知道,人类的眼睛是最为精密的照相机,可以感知的对比度甚于任何一种仪器设备 —— 从天际远处微弱的星光,到太阳高高挂的艳阳天,人们都可以同时辨别一个场景中亮处以及暗处的细节。要知道,通常这一亮一暗所表示的对比度是相当惊人的。为了解释这个问题,首先我们要知道人眼的构造。人的眼分为感光细胞所在的视网膜和折光部分。人眼适应波长约为380-740nm的电磁波,也就是可见光部分。一般人眼中有三种不同的锥状细胞和一种杆状细胞;第一种感受红色,最敏感点在565纳米左右;第二种主要感受绿色,最敏感点在535纳米左右;第三种感受蓝色,最敏感点在445纳米。这些锥状细胞的敏感曲线大致是呈钟形的正态分布。但是,每种锥状细胞不仅仅感受自己最敏感的那部分电磁波,它们同时对其他波长的光也有反应。事实上,对于颜色的感觉也取决于自身的喜好感觉,甚至心理状态与经验感受。

  随着显示技术的发展,LCD显示器越来越普及开来逐渐代替代替了CRT显示器。与此同时,显示硬件可以生成的颜色越来越丰富,原始的色彩标准就显得更加落伍了,重新定义一个新的色彩标准就显得特别有必要,而且还要能够正确的映射旧色彩标准空间到新的色彩空间中去,这样才能够保证向前的兼容。

真实的问题True Problem

  最简单的办法,使用浮点数,利用它几乎无限的精度来表示相比来说比较有限的颜色 —— 大部分人只可以识别大约一千多万种颜色,况且很多颜色并不是很经常使用。目前我们使用的有IEEE754标准的浮点数,还有OpenEXR所使用,并兼容NVIDIA、ATi硬件的半浮点格式。浮点数的缺点和优点一样明显,占据的体积实在太大。在实时渲染中还是推荐使用Half半浮点数表示,硬件可以对这种格式进行快速的插值采样过滤,而因为受制于有限的带宽,硬件处理32bit浮点就有些力不从心。

  让我们回到开始,重新探讨Color的本质。可见光本质是什么?是一个波长范围内的电磁波,而且是连续范围内所有电磁波能量的积分。世界上当然有激光这种纯单色的光源,但是我们接触的几乎都不是单色的,比如太阳,日光灯,白炽灯。人眼将这些混合光的颜色与单色光源的光的颜色看成同样的,比如橙色的波长为600nm左右,可实际上可以由红色和绿色的光混合而成的,因为显示器无法产生单色的橙色。下面展示一个Spectral Rendering光谱渲染公式,本质上与Gobal Illumination全局光照技术相通。

 

  这个公式中隐含了几个假设:1、物体反射光波长等于从光源入射光的波长,物体本身绝对不发光,违反了量子力学的黑体辐射理论;2、光线入射位置等于出射位置,无散射,这把物体想象成了理想平面忽视微平面效应。3、无偏振、衍射,违反的材质的光学特性。我们现在当然不能吹毛求疵,现在的光线跟踪渲染器如VRay、Mental Ray、Maxwell Render、RenderMan等,即使没有充分的考虑到这些真实特性,在不少CG艺术家手中也产生了足以欺骗普通人眼睛的照片级真实的图形。事实上,许多物理研究人员早就已经作了大量工作,指出各种各样的问题,但从事CG行业的人员却认为很多问题已经得到解决。因为对于CG,人们更加愿意把它当作使用技术的艺术,而不是另外一种纯粹的技术。

Tone Mapping

  让我们回过去看那个Spectral Render光谱渲染公式。如果我们有了一张光谱图,将它转换成可以显示的图象需要2个步骤。第一步,利用标准CIE Observer Functions观测函数,将Spectral RAdiances光谱辐射转换到Tristimulus Space三激值空间CIE XYZ。第二步,将CIE XYZ数值转换到色彩空间。第二个步骤叫做Tone Mapping,而且有三个注意要点:

  1. 色彩:我们需要的是精确的颜色,与观测者本身无关
  2. 饱和度:尽可能的维持饱和度不受干扰,允许一部分色彩漂移。
  3. 感受:尽可能把保证当映射到有限色彩范围时,让人感觉依旧真实。

  在实现上,主要有以下几种技术:

  •  对原始色彩的范围进行统一缩放,与显示的范围匹配。
  •  与A的方法一致,不过需要进行显示范围裁减,影响到饱和度不高或极高的颜色。
  •  利用Global Histogram全局图象统计图的数据,对色彩进行相应缩放。

Death in Physics

  在我们具体的实现Tone Mapping之前,我们首先一定要搞清楚XYZ RGB这些看似眼熟的东西到底都是怎样的一回事。一个最简单的光照模型,一个单色光源,一个理想的散射平面,它释放的辐射用下式表示:

其中ρd(λ)是波长的Diffuse Reflectance散射反射比函数。Ei(λ)是从各个光源积分计算得到的入射辐射度。这样我们就可以使用标准CIE函数进行转换了:

  万事具备了么?远远不够。下面通过一个实际的例子来展示一个可行的方法。

I'm A Flower

  我们选择3种光源,2856K的钨(白炽灯)Illum A,模拟的日光照明Illum B,6500K的太阳光Illum D65。分别分析它们的发射光谱。

  从图上我们可以轻松的辨别出哪条是钨产生的曲线,蓝色的就是,大量集中于长波长段,也就是发出红色黄色的光成分居多。

  随后我们在三个光源的分别作用下,对MacBeth BlueFlower麦克佩斯蓝花的发射光谱进行分析。

  通过分析光谱数据,我们计算得到在3种色彩标准下的不同数值图。

 

Matrix Bible

  我们是如何得到上述9种不同的数据呢?使用如下的矩阵计算式:

  如果我们需要在不同的光照条件下进行转换,使用如下的算式:

  这里是线性Von Kries模型与CMCCAT2000矩阵,用于在不同光照条件下进行色彩的转换。至于原始White Point白点(Rw,Gw,Bw)通过CIE XYZ与CMCCAT2000矩阵相乘得到。为了简化我们的操作,将冗长的矩阵相乘算式总结成下面的两个矩阵,用于直接将B、A照明条件下的CIE XYZ转换成RGB。

Greedy Request

  到现在位置,显然我们迫切需要一种表现力超强,占用体积小,并且与设备无关的纹理文件格式。1985年为了基于辐射度渲染器的需要,实现了32bit RGBE纹理格式。Pixar有一种33bit log的RGB格式用于REYES渲染器,日后被开源,形成今日的LibTIFF库。后来作者在SGI工作,对这个库做了一些更新,大幅度提高了表现范围,使用RLE压缩方法让文件更小。

  在以上所有提到的格式种,只有SGI's LogLuv TIFF编码格式覆盖了所有的色彩与动态范围。RGBE格式的动态范围也很大,不过其RGB值只能是正的,所以还有一些颜色无法表示。Pixar的格式劣势在于较小的范围。所以人们使用LogLuv TIFF格式,目前很多软件都可以处理这种格式。

Back To

  结束了?是的,结束了,实践证明,第三种方法在实时渲染中比较可行。大家不妨可以找找NVIDIA的一篇PPT和相关DEMO,关于如何在GPU上实现HDR,有几篇Paper可以去看。

E?cient Histogram Generation Using Scattering on GPUs

CARUCCI, F., 2006. HDR meets Black & White 2. Game Developers Conference 2006: D3DTutorial Day, March.

  本文大部分基于Greg Ward的High Dynamic Range Imaging一文,相关图片公式均来自此文,版权属于原作者。

posted on 2007-05-25 19:36  Bo Schwarzstein  阅读(3305)  评论(4编辑  收藏  举报