高动态范围光照

前言

通常情况下,艺术家会进行所有 3D 建模,然后进行所有纹理处理,在 3D DCC 中查看他们令人敬畏的模型并说“看起来很棒,可以进行整合!”然后进入游戏,设置灯光并运行游戏。

那么, 所有这些” HDR”业务在什么时候发挥作用?要理解答案, 我们需要查看显示器的行为.

您的显示器输出线性光比率从某个最大强度到某个最小强度. 现代游戏引擎在各自的场景中对线性光值进行复杂的数学计算. 这将会有什么问题呢?

根据显示器类型的不同, 显示的强度范围有限. 然而, 游戏引擎渲染的强度值范围没有限制. 虽然 “最大强度” 对sRGB显示器来说有一定的意义, 但在游戏引擎中却没有任何影响;每帧渲染时可能产生无限宽的强度值范围.

这意味着场景光强,也称为场景对应(scene-referred)的光照比率,需要进行转换和映射以适应所选显示器的特定输出范围。这就类似通过虚拟摄像机拍摄我们的游戏引擎场景,在这里,我们的虚拟摄像机将对场景数据应用特定的摄像机渲染变换,其输出将以特定的显示类型显示。

备注

Godot目前尚不支持高动态范围 输出. 它只能在HDR中执行照明, 并将结果映射为低动态范围的图像.

对于高级用户来说, 仍然可以得到一个非色调映射的视图图像与完整的HDR数据, 然后可以保存到一个OpenEXR文件.

计算机显示器

几乎所有显示器都需要对发送给它们的代码值进行非线性编码. 显示器又利用其独特的传输特性, 将代码值 “解码” 为输出的线性光比, 并在每个红色, 绿色和蓝色发射点的独特颜色的光中投射出这些比值.

对于大多数计算机显示器来说,显示器的规格是根据 IEC 61966-2-1,即 1996 年的 sRGB 规格,进行概述的。该规范概述了 sRGB 显示器的性能,包括 LED 像素中的灯光颜色以及输入(OETF)和输出(EOTF)的传输特性。

并非所有显示器都使用与计算机显示器相同的OETF和EOTF. 例如, 电视广播显示器使用BT.1886 EOTF. 然而,Godot目前只支持sRGB显示器.

sRGB标准是围绕着常见的桌面计算CRT显示器的电流与光输出之间的非线性关系而制定的.

../../_images/hdr_gamma.png

场景参考模型的数学要求我们将场景乘以不同的值, 以调整不同光照范围的强度和曝光. 显示器简单的传递函数不能恰当地渲染游戏从引擎场景中输出的更大动态范围. 这需要一种更复杂的编码方法.

场景线性和资源管道

在场景线性sRGB中工作并不像按一下开关那样简单. 首先, 导入的图像素材必须在导入时转换为线性光比例. 即使将其线性化, 这些素材也可能并不完全适合用作纹理, 具体取决于它们的生成方式.

有两种方法可以做到这一点:

用于在图像导入时显示线性比率的sRGB传递函数

这是最简单的使用sRGB资源的方法, 但不是最理想的. 这样做的一个问题是质量的损失. 每通道使用8位来表示线性光比率, 不足以正确量化这些值. 这些纹理以后也可能会被压缩, 可能会加剧这个问题.

硬件sRGB传输函数显示线性转换

GPU 会在使用浮点读取纹素后进行转换。这在 PC 和游戏主机上很好用,但大多数移动设备不支持,或者它们不支持压缩的纹理格式(例如 iOS)。

场景线性到显示参考的非线性

完成所有渲染后, 场景线性渲染需要转换为适当的输出, 例如sRGB显示. 为此, 请在当前的: Environment 中启用 sRGB 转换(更多内容见下文).

请记住, sRGB ->显示线性(Display Linear)显示线性 -> sRGB 的转换必须始终 全部(both) 启用. 未能启用其中一个将导致仅适用于前卫实验性独立游戏的可怕视觉效果.

HDR的参数

HDR可以在 Environment 资源中找到. 这些在大多数情况下都可以在 WorldEnvironment 节点中找到或在相机中设置. 更多信息请参阅 环境和后期处理.