高动态范围

介绍

通常,一个艺术家会做所有的3D建模,然后所有的纹理,在3D DCC中查看他们的漂亮模型,然后说“看起来很棒,准备好集成了!”然后进入游戏,灯光设置和游戏运行。

那么,HDR业务在什么时候开始发挥作用呢?其想法是,我们不处理从黑色到白色(0到1)的颜色,而是使用比白色更白的颜色(例如,0到8倍白色)。

更实际的是,假设在常规场景中,灯光的强度(通常为1.0)设置为5.0。整个场景会变得非常明亮(变白),看起来很恐怖。

之后,通过平均场景中每个像素的亮度来计算场景的亮度,该值用于将场景恢复到正常范围。最后一个操作称为音调映射。最后,我们在一个类似的地方开始:

../../_images/hdr_tonemap.png

除了场景对比度更高,因为在游戏中有更高的光照范围。这对什么有用?其理念是,当您在世界中移动时,场景亮度将发生变化,从而允许类似的情况发生:

../../_images/hdr_cave.png

此外,还可以根据像素亮度设置发送到辉光缓冲区的阈值。这样可以在场景中产生更逼真的灯光出血效果。

线性颜色空间

这项技术的问题在于,计算机显示器应用伽马曲线来更好地适应人眼的视觉方式。艺术家也在屏幕上创造他们的艺术,所以他们的艺术有一个隐含的伽马曲线应用于它。

在计算机监视器上创建的图像所在的颜色空间称为“sRGB”。人们在电脑上或从互联网上下载的所有视觉内容(如图片、电影等)都在这个颜色空间中。

../../_images/hdr_gamma.png

HDR的数学要求我们将场景乘以不同的值,以调整亮度和曝光到不同的光照范围,而这条曲线阻碍了我们,因为我们需要线性空间中的颜色。

线性颜色空间和资产管道

在HDR中工作不仅仅是按下一个开关。首先,导入的图像资源必须在导入时转换为线性空间。有两种方法可以做到这一点:

sRGB->图像导入时的线性转换

这是使用线性空间资产最兼容的方式,它将在任何地方工作,包括所有移动设备。与此相关的主要问题是质量损失,因为sRGB的存在是为了避免同样的问题。从人眼的角度来看,每个通道使用8位来表示线性颜色是无效的。这些纹理稍后可能也会被压缩,这会使问题变得更严重。

不过,在任何情况下,这都是适用于所有地方的简单解决方案。

硬件sRGB->线性转换

这是在线性空间中使用资源的最正确方法,因为GPU上的纹理采样器将在使用浮点读取texel后进行转换。这在PC和控制台上工作得很好,但大多数移动设备不支持它,或者不支持压缩纹理格式(例如iOS)。

线性->端部SRGB

所有渲染完成后,线性空间渲染图像必须转换回sRGB。为此,只需在当前 Environment (更多内容见下文)。

请记住,sRGB->线性和线性->sRGB转换必须始终 both 启用。如果不启用其中一个,将导致可怕的视觉效果,仅适用于前卫的实验性独立游戏。

HDR参数

HDR设置可在 Environment 资源。大部分时间都是在 WorldEnvironment 节点或设置在照相机中。有关详细信息,请参阅 环境与后处理 .