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位细节)
- 显示适配——根据终端设备能力自动映射
工作流程
- 调色阶段:在12位PQ空间完成调色,生成Mastering Display版本
- 分析阶段:杜比算法逐帧分析亮度分布,生成动态元数据
- 编码阶段:基础层编码为HDR10兼容流,增强层编码为HEVC 12位
- 分发阶段:播放器根据显示设备能力,用动态元数据做实时映射
个人经验: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 格式选型决策框架
下面这张图是我自己总结的选型逻辑,帮你快速判断该用哪个格式。
3.8 实际工作中的选型建议
说了这么多,最后给几条我自己的实战建议:
- 存档用EXR——所有原始素材、调色中间版本、最终母版,都用OpenEXR fp16。别省这点硬盘钱,以后重调色的时候你会感谢自己。
- 预览用Radiance HDR——快速看环境贴图效果、做灯光参考,.hdr文件打开快、传输方便。
- 分发用HDR10——如果你的内容要上流媒体、电视、游戏主机,HDR10是底线。没有HDR10支持,很多设备直接不认。
- 高端项目考虑Dolby Vision——院线电影、高端纪录片、旗舰手机宣传片,DV的动态元数据确实能带来肉眼可见的提升。
重要提醒:不要在一个项目里混用多种HDR格式的元数据标准。我见过有人用HDR10的静态元数据去指导Dolby Vision的调色,结果色彩映射全乱套。格式转换时,元数据必须重新生成,不能直接拷贝。