HDR 照明 (Direct3D 9)

现实世界中的照明包含非常高的动态范围 (HDR) 亮度值。 现实世界有大约 10 个动态范围 (DR) ,亮度值分布在黑暗到亮度的光谱中。 另一方面,计算机屏幕具有非常有限的显示范围 (或亮度值范围) :大约两个动态范围。 生成 HDR 渲染图像的挑战是将现实世界的 HDR 值映射到计算机屏幕的有限范围中。

音调映射是 DirectX 用于将 HDR 信息映射到受限范围的技术。 应用于 CGI 渲染的色调映射可以显著改善渲染的照明细节量,允许查看最暗区域的细节,并在非常亮、看起来被烧毁的区域提供对比度。 生成的场景以更可见的照明细节呈现。

HDRLighting 示例 是演示 HDR 照明的 SDK 示例。

音调映射

音调映射通常模拟无法由监视器的 DR 引起的光学现象。 例如,耀斑或盛开的 (主要是镜头) 的属性、在低光条件下人眼发生的蓝色移位,以及眼睛生物化学产生的其他适应。 如果显示器的 DR 足够大,则色调映射将没有必要,除非提供艺术效果或相机镜头或充电耦合设备的某些属性 (CCD) 。

色调映射将场景中的亮度值范围划分为一组区域。 每个区域都包含一系列亮度值。

HDR 使用以下术语:

  • 区域 - 亮度值的范围
  • 中间灰色 - 场景的中间亮度区域
  • 动态范围 - 最高场景亮度与最低场景亮度的比率
  • 关键 - 场景照明的主观测量:从浅到中到深不等

若要根据 RGB 值计算亮度,请使用:

L = 0.27R + 0.67G + 0.06B;

对数平均亮度是场景键的有用近似值。 一般公式如下所示:

Lw = exp[ 1 / N ( sum[ log ( delta + Lw ( x, y ) ) ] ) ]

其中:

  • Lw - 对数平均亮度
  • N - 图像中的像素数
  • 增量 - 避免黑色像素问题的一个小因素
  • Lw ( x,y ) - 像素 ( x、y ) 的世界空间亮度

若要将此值映射到中间灰色值,请使用以下亮度缩放运算符:

L ( x,y ) = a * Lw ( x,y ) / Lw

其中:

  • L ( x、y ) - 像素 ( x、y ) 的缩放亮度
  • a - 应用缩放后的图像键值

最后,下面是用于压缩高亮度的简单音调映射运算符:

Ld ( x,y ) = L ( x,y ) / ( 1 + L ( x,y ) )

其中:

  • Ld ( x、y ) - 像素 ( x、y ) 的压缩和缩放亮度
  • a - 应用缩放后的图像键值

此运算符按 1/L 缩放高亮度,将低亮度缩放 1。 有关更多详细信息,请参阅以下文章。

赖因哈德、埃里克、迈克·斯塔克、彼得·雪莉和詹姆斯·费沃达。 “数字图像的摄影色调复制”。 ACM Transactions on Graphics (TOG) ,第29届计算机图形和交互技术年会论文集 (SIGGRAPH) ,第267-276页。 纽约,纽约:ACM出版社,2002年。

高级主题