在过去几年中,高动态范围技术(High Dynamic Range,简称 HDR)已经逐渐普及。越来越多的电视、显示器和移动设备开始支持 HDR 技术。从 Unity (和 beta)版本起,Unity 编辑器及独立平台运行版(Standalone Players)已支持 HDR 特性,并且完全兼容通用渲染管线(URP)和高清渲染管线(HDRP)。
HDR 技术优势
【资料图】
启用 HDR 渲染后,摄像机会将场景渲染到一个浮点帧缓冲区中,使渲染管线能存储更广的色值、更好地保留细节。类似光照和后处理等着色器运算能用更精确的值执行(相较于 SDR 渲染),从而呈现更逼真的画面。
尽管多年来 HDR 渲染一直是默认的工作流程,但未启用 HDR 的显示器会将可呈现的画面色彩深度限制在最大每通道 8 位以内。每个像素可以表示的最大颜色数量和最大亮度范围皆受到了限制。
此时会进行 HDR 到 SDR(Standard Dynamic Range,标准动态范围)的色调映射(tone mapping),来将色彩缓冲区的 HDR 数值重新映射到低动态范围内,有时也会采用伽玛矫正(gamma correction),最后把结果写入交换链(swap chain)图像用于展示。
此前 Unity 为高清渲染管线(HDRP)推出了桌面和主机平台上的 HDR 显示支持。这是通过在创建交换链时设定使用设备原生的色彩空间,再用定制的 HDR 色调映射将色彩缓冲区的内容重新映射为显示器原生的 HDR 范围来实现的。最后再应用 HDR 编码,把结果写入 HDR 交换链图像。
启用 HDR 输出后,交换链图像格式将启用更高的色彩深度(每通道 10 位或 16 位)。这时每个像素就能展示出更广的色值,亮度范围也极大增加。
自 Unity 起,Unity 编辑器和独立平台运行版将为所有渲染管线及具备该功能的平台提供完整的 HDR 色调映射和支持。
启用 HDR
可在 Edit > Project Settings > Player > Other Seetings 下的 Player Settings 里找到新的 HDR 显示设定:
如上图所示,勾选Allow HDR Display Output(允许 HDR 显示输出)和Use HDR Display Output(启用 HDR 显示输出)。这些设定会让 Unity 编辑器和独立平台运行版在支持的平台上运行时启用 HDR 输出。
启用 HDR 输出后,可以选择将 Swap Chain Bit Depth 配置为较低(例如每通道 10 位)或较高(例如每通道 16 位)的图像色彩深度。*需要注意对应设备或平台的色彩深度限制,并非所有设备都支持 16 位缓冲格式,部分设备会回滚到 10 位格式。
*在通用渲染管线(URP)中,当前所用的渲染管线资产须启用 HDR 渲染。请选中项目内的渲染管线资产(通常位于 Assets > Settings 文件夹),在项目 Inspector 面板内启用 Quality > HDR。
最后,启用 HDR 色调映射,即为影响摄像机的后处理体积(volume)添加 Tonemapping 组件。在启用 HDR 输出后,下方 Tonemapping 设定将由显示器的 HDR 功能所控制:
最小支持亮度
最大支持亮度
纸张白值(Paper White value):它表示纸张白色表面在显示器上的亮度,用于确定显示器的整体亮度
如果要取得更棒的视觉体验,推荐在专业 HDR 校准界面为这些参数提供运行时控制。
可以用 C# API 来获取显示器的 HDR 范围和纸张白值。详见:
/Documentation/ScriptReference/
要取得最棒的视觉体验,我们推荐在专门的HDR校准界面上为这些参数提供运行时控制。我们即将发布一个新HDR校准样例项目,作为操作参考。
若想详细了解HDR色调映射和输出,请参阅更新后的URP的HDR输出文档及HDRP的HDR输出文档。
URP的HDR输出文档:
/Packages/@/manual/post-processing/
HDRP的HDR输出文档:
/Packages/@/manual/
平台支持
要在运行时利用 HDR 输出,设备须连接到一台具备 HDR 功能的显示器,在不兼容的设备上运行时,HDR 输出会被自动禁用。可以用 来查询主显示器是否支持 HDR 显示、HDR 输出是否已启用。除了 Unity 2022 中提供的已有桌面和主机支持外,在 Unity ,以下平台也已支持 HDR 输出:
iOS 平台运行版(iOS 16 及以上,iPadOS 16 及以上)
使用 Vulkan 和 GLES 的 Android 平台运行版(Android 9 及以上,*视不同设备而定)
不仅是移动、主机设备,此次同样推出了 XR 平台相关支持。请参阅对应 XR 平台的说明文档来确定是否支持 HDR 显示。
使用指南
HDR 处理分为两个步骤:HDR 色调映射和编码。这两个步骤通常在后处理渲染通道内的最后一步。唯一例外是向 URP 插入额外的通道,此时,HDR 编码会单独应用到“final blit(最终的位块转移)”通道,这一通道总是在渲染管线的最后被调用。
插入到 RenderPassEvent . AfterRenderingPostProcessing 事件的 Custom Overlay Passes 需要经过特殊处理才能支持 HDR 输出。倘若 HDR 输出已被激活,后处理已经启用,之前的通道一定已经执行了色调映射和色彩空间转换。因此,需要编写自定义效果才能转换到目标动态范围和色彩空间。
在使用 HDR 输出时,推荐给所有可显示的摄像机启用 HDR 渲染。当然也可以基于某个相机禁用 HDR 渲染,但要确保在后处理之后没有执行渲染通道或在后处理之后插入通道的特效。
在用 SDR 渲染配合 HDR 输出时,以下功能将不受支持:
图像扩大
FXAA(Fast Approximate Anti-Aliasing)抗锯齿
HDR Debug Modes(调试模式)
后处理之后的自定义通道
* 2D Renderer 中若想用 SDR 渲染配合 HDR 输出,请确保后处理已关闭。
如想了解更多详细信息,请参阅官方说明文档:
通用渲染管线(URP)HDR 输出:
/Packages/@/manual/post-processing/
高清渲染管线(HDRP)HDR 输出:
/Packages/@/manual/