3、HDR存储格式:OpenEXR、Radiance HDR、HDR10、Dolby Vision

做HDR开发这些年,我接触过不下十种存储格式。但真正在工业界站稳脚跟的,其实就四个:OpenEXR、Radiance HDR、HDR10和Dolby Vision。它们各有各的脾气,选错了格式,后面整个管线都得跟着遭殃。

今天咱们就把这四种格式掰开揉碎了讲清楚。我会从技术原理讲到实际坑点,帮你建立一套选型判断力。

3.1 为什么需要多种HDR格式?

说白了,HDR格式要解决三个核心矛盾:

  • 精度 vs 文件大小——浮点存储精度高,但体积大;整数存储省空间,但容易丢细节
  • 元数据 vs 兼容性——静态元数据简单粗暴,动态元数据精细但复杂
  • 专业制作 vs 消费分发——后期调色需要32位浮点,电视播放只需要10位整数

没有一种格式能同时满足所有场景。我见过有人硬拿HDR10去做电影级调色,结果色阶断层修都修不回来。嗯,选格式之前,先想清楚你的终点在哪。

3.2 OpenEXR——工业级浮点存储

这是ILM(工业光魔)在1999年开发的格式,后来开源了。现在几乎所有VFX和动画电影都在用。我个人习惯把它叫做「HDR的底片格式」。

核心特性

  • 16位/32位浮点——支持半精度(fp16)和全精度(fp32),动态范围理论无限
  • 多通道——一个文件可以存RGB、Alpha、Z深度、法线、运动向量
  • 无损压缩——PIZ、ZIP、RLE等算法,压缩比通常在2:1到4:1
  • 开放标准——C++/Python SDK齐全,管线集成成本低

关键指标:OpenEXR的fp16格式,每个像素只占6字节(RGB各16位),却能覆盖从10⁻⁶到10⁴的亮度范围。这在2000年代是革命性的。

我在项目中遇到的坑

有一次做HDR合成,渲染器输出的EXR文件在Nuke里看一切正常,但导入达芬奇调色时暗部出现了奇怪的条纹。查了两天才发现——渲染器默认用了fp32,但达芬奇某些版本对fp32的EXR解码有精度截断问题。解决方案很简单:输出时强制指定fp16。

避坑指南:我曾经因为EXR的「无限动态范围」吃过亏。实际上,fp16只能表示大约5.9位有效十进制数字,fp32是7.2位。如果你在做科学可视化或天文HDR,请用fp32或直接上OpenEXR的float类型。

适用场景

场景 推荐配置 原因
VFX合成 fp16 + PIZ压缩 平衡精度与I/O速度
电影级调色 fp32 + 无压缩 保留最大调色空间
实时渲染缓存 fp16 + ZIP压缩 解码速度快

3.3 Radiance HDR——轻量级老将

Radiance HDR(也叫RGBE格式)是Greg Ward在1985年开发的。你想想看,一个快40岁的格式,现在还在用,说明它确实有两把刷子。

工作原理

RGBE的核心思路很聪明:用4个字节存一个像素。前三个字节是RGB的尾数(mantissa),第四个字节是共享的指数(exponent)。

// RGBE编码伪代码
// 输入:R, G, B (浮点,范围0到很大)
// 输出:4字节 [R_mantissa, G_mantissa, B_mantissa, shared_exp]

max_val = max(R, G, B)
exp = ceil(log2(max_val)) + 128  // 偏置指数
mantissa_R = R / (2^(exp - 128))
mantissa_G = G / (2^(exp - 128))
mantissa_B = B / (2^(exp - 128))
// 每个mantissa量化到[0, 255]

说白了,它用共享指数来扩展动态范围,但牺牲了色彩精度。每个颜色通道只有8位精度,但动态范围能到10⁷⁶级别——虽然实际没人用到那么高。

小技巧:Radiance HDR的.hdr文件可以用文本编辑器打开看头部信息。我经常用它来快速检查一张HDR环境贴图的曝光范围是否合理。

优缺点

  • 优点:文件小(比EXR小30-50%)、解码快、几乎所有渲染器都支持
  • 缺点:精度低(8位/通道)、不支持Alpha通道、不支持多图层

适用场景

环境贴图(IBL)、快速预览、Web端HDR展示。但别用它做调色中间格式——精度不够,调两下就断层了。

3.4 HDR10——消费级标杆

HDR10是2015年由消费者技术协会(CTA)制定的标准。它不是一个文件格式,而是一个传输/显示规范。但因为它太普及了,做HDR内容的人必须懂它。

技术参数

参数 值 说明
位深 10位/通道 1024级灰度,比8位多4倍
色彩空间 BT.2020 覆盖75%的可见光谱
传递函数 PQ(ST 2084) 亮度映射,最大10000 cd/m²
元数据 静态(SMPTE ST 2086) 整部影片一个亮度上限
色度采样 4:2:0(主流) 节省带宽

核心理解:HDR10的10位精度配合PQ曲线,在1000 cd/m²的显示器上能实现约0.005 cd/m²的暗部步进。这已经超过了人眼在暗部的分辨能力。所以10位对消费级HDR是够用的。

HDR10的局限

静态元数据是它最大的软肋。举个例子:一部电影最亮场景是4000 cd/m²,最暗场景只有100 cd/m²。HDR10只能给整部片子设一个亮度上限——要么4000,要么100。选4000,暗场景的暗部细节会被压缩;选100,亮场景直接过曝。

我在做HDR10母版时遇到过这种情况:一部夜景戏为主的电影,中间插了一个白天的爆炸镜头。静态元数据设成1000 cd/m²,结果爆炸镜头的高光细节全没了。后来只能手动调那个镜头的亮度曲线,勉强补救。

3.5 Dolby Vision——动态元数据方案

Dolby Vision(简称DV)是杜比在2014年推出的。它和HDR10最大的区别就是——动态元数据。

核心优势

  • 动态元数据(RPU)——每一帧或每个场景都可以有独立的亮度映射参数
  • 12位/通道——4096级灰度,调色空间更大
  • 双层编码——基础层(兼容HDR10)+ 增强层(12位细节)
  • 显示适配——根据终端设备能力自动映射

工作流程

  1. 调色阶段:在12位PQ空间完成调色,生成Mastering Display版本
  2. 分析阶段:杜比算法逐帧分析亮度分布,生成动态元数据
  3. 编码阶段:基础层编码为HDR10兼容流,增强层编码为HEVC 12位
  4. 分发阶段:播放器根据显示设备能力,用动态元数据做实时映射

个人经验:Dolby Vision的调色流程比HDR10复杂得多。我建议团队至少要有一个人专门负责元数据分析和验证。否则很容易出现「在调色监视器上看完美,在用户电视上翻车」的情况。

授权与成本

Dolby Vision需要授权费。制作端要买调色软件插件(约500-2000美元/年),播放端要交硬件认证费。这也是为什么很多流媒体平台只在自制剧上用DV,第三方内容还是以HDR10为主。

3.6 四种格式对比总表

维度 OpenEXR Radiance HDR HDR10 Dolby Vision
位深 16/32位浮点 8位整数 10位整数 12位整数
动态范围 理论无限 ~10⁷⁶:1 ~10⁴:1 ~10⁶:1
元数据 无标准 无 静态 动态
色彩精度 极高 低 中 高
文件大小 大 小 中 中(双层)
主要用途 制作/存档 预览/IBL 分发/播放 高端分发
授权 开源免费 开源免费 免授权费 需授权

3.7 格式选型决策框架

下面这张图是我自己总结的选型逻辑,帮你快速判断该用哪个格式。

HDR存储格式选型决策框架 你的HDR内容要做什么? 制作/调色/存档/合成 → 选 OpenEXR(fp16或fp32) 分发/播放/流媒体 预算充足/追求画质 兼容优先/成本敏感 → Dolby Vision → HDR10 提示:预览/环境贴图用 Radiance HDR;最终交付前用 OpenEXR 做存档母版

3.8 实际工作中的选型建议

说了这么多,最后给几条我自己的实战建议:

  • 存档用EXR——所有原始素材、调色中间版本、最终母版,都用OpenEXR fp16。别省这点硬盘钱,以后重调色的时候你会感谢自己。
  • 预览用Radiance HDR——快速看环境贴图效果、做灯光参考,.hdr文件打开快、传输方便。
  • 分发用HDR10——如果你的内容要上流媒体、电视、游戏主机,HDR10是底线。没有HDR10支持,很多设备直接不认。
  • 高端项目考虑Dolby Vision——院线电影、高端纪录片、旗舰手机宣传片,DV的动态元数据确实能带来肉眼可见的提升。

重要提醒:不要在一个项目里混用多种HDR格式的元数据标准。我见过有人用HDR10的静态元数据去指导Dolby Vision的调色,结果色彩映射全乱套。格式转换时,元数据必须重新生成,不能直接拷贝。