概念页
色调映射
Tone Mapping
色调映射把场景参考的辐射亮度转换为显示参考的辐射亮度,目标不是恒等复现、也不是把所有信息"挤进"显示范围,而是在显示条件下尽量复现观看原场景时的感知印象。它通常是曝光缩放加一条 S 形曲线(全局映射),之后可做调色;最后由显示编码输出到 SDR 或 HDR 显示器。
成像管线
flowchart LR A["渲染: 线性场景辐射亮度"] -->|"色调映射"| B["线性显示辐射亮度"] B -->|"显示编码 逆 EOTF"| C["非线性码值"] C -->|"显示器 EOTF"| D["屏幕发出的线性辐射亮度"]
- 两种图像状态:场景参考 (scene-referred) 与显示参考 (display-referred),与编码无关,两者都可线性或非线性编码。
- 物理运算只在场景参考数据上有效;两种状态之间总需要一个非线性变换。
为什么是 S 曲线
- 目标是图像复现;另一种"偏好图像复现"追求比原场景更好看,即调色。
- 视觉系统有适应能力:昏暗房间屏幕上的户外场景亮度不到原场景 1%,仍能产生相似感知。但适应不完美:低亮度下感知对比度降低(Stevens 效应)、色彩丰富度降低(Hunt 效应);显示器周围亮度影响感知对比(Bartleson–Breneman 效应);显示眩光(缺陷或屏幕反射加入的杂光)显著降低实际对比度。因此需要提高对比度和饱和度。
- 场景动态范围远大于显示,只能复现一个窄亮度窗口,上下被截成黑白;提高对比度使窗口更窄,于是用柔和滚降找回部分暗部和高光细节。结果就是类似胶片的 S 形曲线——柯达等公司精心调整过胶片乳剂,所以讨论中常出现"filmic"。
曝光与全局映射
- 渲染中曝光是色调变换前对场景参考图像的线性缩放;难点是缩放因子。色调变换通常假设输入按某种方式曝光。
- 曝光缩放加色调曲线是全局色调映射(所有像素同一映射);局部映射按像素邻域不同。实时应用几乎只用全局映射。
色调曲线
- 可分别作用于 R、G、B:结果自动在显示色域内,但非线性操作(尤其截断)会造成饱和度和色相偏移。饱和度提升在感知上可能有益(抵消 Hunt 效应),色相偏移通常不受欢迎,现代变换在曲线后做额外 RGB 调整以减少它。
- 作用于亮度可避免/减少偏移,但结果可能超出色域,需要映射回来。
- 对场景参考颜色做非线性变换可能干扰某些抗锯齿技术(见 5.4.2 节)。
- 常见曲线:Reinhard(暗部基本不变,亮部渐近于白);Drago 等(可按输出显示亮度调整,可能更适合 HDR);Duiker 近似柯达胶片曲线,Hable 加入更多控制并用于《神秘海域 2》("Hable filmic 曲线"),后来又提出改进曲线;Day 的 S 曲线(Insomniac、《使命召唤:高级战争》);Gotanda 模拟胶片与数码传感器(《星之海洋 4》)。
- Lottes 指出显示眩光对有效动态范围影响很大且取决于房间照明,因此应提供用户可调的色调映射,并给出同时适用于 SDR 和 HDR 的变换。
- 书中比较:截断丢失高光;Reinhard、Duiker、Frostbite 都保留高光,但 Reinhard 倾向使暗部去饱和,Duiker 增加暗部饱和度,Frostbite(保色相版)保持饱和度和色相,避免了其他三者在高亮处的强烈色相偏移。
ACES
- 把场景到屏幕变换分为两部分:RRT(参考渲染变换)把场景参考值转换到设备中立的输出空间 OCES;ODT(输出设备变换)针对具体显示设备和观看条件从 OCES 转换到最终编码。RRT 与对应 ODT 级联即总变换,模块化便于支持多种显示。
- 需要同时支持 SDR 和 HDR 时推荐使用 ACES。Unreal 默认启用 ACES 色调映射,Unity 也支持;Narkowicz、Patry 给出拟合 RRT+ODT 的廉价曲线,Hart 给出参数化 ODT。
HDR 显示与 Frostbite
- HDR 显示器自身还会做色调映射。Frostbite:SDR 用较激进的曲线,HDR10 用较温和的(随显示峰值亮度有所变化),Dolby Vision 不做色调映射,依赖显示器内建映射。
- Frostbite 变换设计为中性,对比度和色相修改交给调色;在 ICTCP 空间中对亮度做映射,并随亮度滚降到显示白而逐渐去饱和,没有色相偏移。讽刺的是,一些依赖旧变换色相偏移的资产(如火焰特效)出了问题,最终又允许用户重新引入一定的色相偏移。
自动曝光
- 常用方法分析场景参考亮度,为避免停顿通常采样上一帧。
- 早期用对数平均亮度(多次降采样直到单个值);平均值对离群值敏感,少数亮像素就能影响整帧。改用亮度直方图求更稳健的中位数,也可利用其他数据点:Valve《橙盒》用第 95 百分位和中位数的启发式;可用计算着色器生成直方图。
- 问题是像素亮度本身就不是驱动曝光的正确指标。参考摄影实践(Ansel Adams 区域系统、入射式测光表),应只用光照(不含表面反照率)决定曝光:曝光大致是为了抵消光照,使照片主要呈现表面颜色,对应人眼的颜色恒常性;也保证色调变换得到正确输入——影视中多数变换把曝光后的场景值 0.18(主光下 18% 灰卡)映射到显示值 0.1。
- 实时中尚不普遍,但《合金装备 V:原爆点》有基于光照强度的曝光系统;许多游戏按已知光照为环境不同区域手动设定静态曝光,避免意外的动态变化。
调色 (Color Grading)
- 偏好图像复现:对颜色进行创造性处理,从电影(《逃狱三王》《天使爱美丽》)传播到游戏并被广泛使用。
- 3D LUT 烘焙(Selan):取恒等 LUT 切片成二维图像,在调色软件中只施加颜色操作(不能有模糊等空间操作),保存后打包成三维 GPU 纹理,渲染时用 RGB 作为 xyz 坐标查表,可表示任意颜色映射(受 LUT 分辨率限制)。Iwanicki 用最小二乘法减少 LUT 采样误差。
- 两种方式:在显示参考数据上调色(容易搭建),或在场景参考数据上调色并通过显示变换预览(保真度更高)。实时应用早期以前者为主,后者因质量更高逐渐流行;还可把色调曲线烘焙进调色 LUT 省计算(《神秘海域 4》)。书中《神秘海域 4》例子:同样的极端青色相乘,在色调映射前后施加效果明显不同。
- 查 LUT 前场景参考数据必须重映射到 [0,1]:Frostbite 用 PQ 的 OETF,Duiker 用对数曲线,Hable 建议开方一到两次。
HDR 显示编码
- SDR:显示器用 sRGB,电视用 Rec. 709 / Rec. 1886,二者色域和白点 (D65) 相同、编码曲线相似但不同,参考白约 80 cd/m²(sRGB)和 100 cd/m²(Rec. 709/1886);厂商实际做得更亮。
- HDR:Rec. 2020 定义更宽色域(白点同为 D65);Rec. 2100 定义 PQ 与 HLG 两种编码,渲染中主要用 PQ,峰值亮度定义为 10,000 cd/m²。实际消费级 HDR 显示器很少超过 1500 cd/m²,色域更接近 DCI-P3,因此显示器内部会做色调和色域映射,可受应用传入的元数据影响。
| 路径 | 帧缓冲 | 编码与色彩空间 | 说明 |
|---|---|---|---|
| HDR10 | 32 位/像素,RGB 各 10 位无符号整数 + 2 位 alpha | PQ + Rec. 2020 | 支持广泛;各型号自行色调映射,不标准也无文档 |
| scRGB(线性) | 每通道 16 位,线性 RGB | 名义 sRGB 原色与白,可 <0 或 >1 | 仅 Windows;驱动转换为 HDR10,便于向后兼容 |
| Dolby Vision | 每通道 12 位自定义格式 | PQ + Rec. 2020 | 专有,支持尚少;内部映射跨型号标准化 |
- 第四种选择:仔细调整曝光和颜色后,也可以通过普通 SDR 信号路径驱动 HDR 显示器并得到好结果。
- 除 scRGB 外,应用要在显示编码时用 3×3 矩阵把工作空间转换到 Rec. 2020,并施加比 sRGB 更昂贵的 PQ 编码(有廉价近似)。在 HDR 上合成 UI 要特别注意可读性和舒适的亮度。
GEA 的视角:HDR 与色调映射(卷 II 12.7.1、12.3.4.1)
- 电视、CRT 等显示设备只能产生有限范围的强度,所以帧缓冲颜色通道限定在 0 到 1;现实中光强可以任意大。HDR 光照做光照计算时不把结果钳制到 ,使极暗和极亮区域都能保留细节;显示前用色调映射把图像的强度范围平移缩放到显示设备支持的范围(浮点格式为 0 到 1,字节整数格式为 0–255)(卷 II 12.7.1)。
- GEA 说这样可以再现很多真实视觉效果,例如从暗室走进明亮区域时的短暂"失明"(对应本页的自动曝光),以及强背光物体后面光似乎溢出来的泛光(见 泛光与镜头光晕)。
- HDR 图像的存储:RGB 通道用 16 位或 32 位浮点代替 8 位整数,或者换一种颜色模型,例如流行的 LogLUV(卷 II 12.7.1,GEA 指向 11.3.3.2 节)。
- 颜色分量可以大于 1,这正是 HDR 光照计算的基础;写入显示用的帧缓冲之前,必须色调映射或钳制到 (卷 II 12.3.4.1)。
- 与本页相比,GEA 只给出了色调映射的基本定义,没有讨论 S 曲线、ACES、调色和 HDR 显示编码。本页上文强调色调映射的目标是在显示上重现场景的感知印象而非简单压缩范围,GEA 的"平移缩放强度范围"是更粗略的表述。
LearnOpenGL 的视角:浮点帧缓冲与 Reinhard / 曝光色调映射(Advanced Lighting / HDR)
来源:HDR;摘录 Advanced Lighting — HDR。
默认 LDR 缓冲会把 >1 的颜色夹断,高亮区糊成一片白。用 GL_RGBA16F(或 32F)颜色附件的 浮点 FBO 暂存 HDR;灯光可用真实量级(如漫反射 100)。最后屏四边形做色调映射再输出默认 FBO。
- Reinhard:
mapped = hdr/(hdr+1),再pow(..., 1/2.2)。 - 曝光:
mapped = 1 - exp(-hdr * exposure),低曝光看清亮部、高曝光看清暗部。
可在光照 shader 末尾直接映射,但复杂场景常需中间 HDR 缓冲。与 显示编码与 sRGB、泛光与镜头光晕 衔接:Bloom 宜在 tone map 之前 加到 HDR 上。
出处
- realtime_rendering_4ed.pdf 第 8 章 Light and Color
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.3.4.1、12.7.1 节
- Advanced Lighting — HDR
- learnopengl.com/Advanced-Lighting/HDR
相关页面
图形学辐射度量学与光度学Radiometry & Photometry辐射度量学精确度量电磁辐射,是基于物理渲染的第一步;光度学用人眼灵敏度对它加权。渲染中最重要的量是辐射亮度 L:眼睛和相机测的就是它,着色方程要算的也是沿视线的辐射亮度。图形学色度学与色彩空间Colorimetry & Color Spaces色度学研究光谱功率分布与颜色感知的关系。人眼只有三种视锥细胞,所以三个数就能精确表示任意颜色刺激;CIE XYZ 是标准的三刺激值空间,各种 RGB 色彩空间由三原色和白点定义,可用 3×3 矩阵互相转换。实时渲染用 RGB 而非光谱计算,严格说是范畴错误,但对非预测性渲染效果出奇地好。图形学显示编码与 sRGBDisplay Encoding & sRGB光照、纹理等计算假设数值是线性的,但显示缓冲和纹理使用非线性编码。简短的回答是:着色器输出 [0,1] 的颜色要取 1/2.2 次幂(gamma 校正),读入的纹理和颜色做相反的变换,多数情况下可以让 GPU 自动完成。忽略它会导致画面偏暗、色相偏移、光照叠加错误和抗锯齿边缘"绳索化"。图形学抗锯齿Antialiasing渲染本质上是采样,采样频率不足就会混叠(锯齿、闪烁的"萤火虫"、车轮倒转)。屏幕空间抗锯齿在每个像素取多个样本并加权求和:超采样最直接但最贵,MSAA 每像素只着色一次,时间抗锯齿 (TAA) 把样本分散到多帧,形态学方法 (FXAA/SMAA) 作为后处理重建边缘。没有一种方法在所有方面最好。图形学泛光与镜头光晕Bloom & Lens Flare镜头光晕是光经镜头系统或眼睛的间接反射等非预期路径产生的现象;泛光 (bloom) 是镜头和眼睛中的散射在亮光周围形成辉光、并降低其他地方对比度。显示器亮度有限,加入这些眩光效果可以暗示更高的亮度。实现上,光晕常用随光源位置变化的公告板或对亮部做图像处理,泛光则是"提取亮部 → 降采样模糊 → 加回原图"(RTR4 12.3 节)。图形学卡通着色Toon Shading非真实感渲染 (NPR,也称风格化渲染) 不追求照片般逼真,而是追求特定目的或画风。卡通 / cel 渲染是其中最受关注的一种:用实线分隔大块纯色区域。表面着色常用纯色填充、两色"硬着色"、或对最终图像做色调分离 (posterization);描边见 轮廓边与几何描边。图形学VR 渲染注意事项VR Rendering Considerations在单屏上效果良好的渲染技术,放到随头部移动的双目显示上可能失效甚至引起不适。本页汇总 RTR4 第 21.4 节列出的需要修改或避免的技术:HUD 深度、凹凸与视差贴图、公告板与天空盒、色调映射与屏幕空间效果、镜面高光视差、抗锯齿选择、色带、运动模糊与景深,以及混合现实中的光照匹配。核心原则:严格遵循厂商头部模型和投影矩阵,任何会让两眼图像难以融合或与前庭感觉冲突的效果都要谨慎。图形学景深Depth of Field相机在给定设置下只有一段深度范围清晰,范围外的物体越远离越模糊。实时渲染默认是完美对焦的针孔相机,所以"景深"指对近景和远景做模糊。实用算法从单张图像出发,按深度算出每像素的弥散圆半径,分离近景与其余部分分别模糊再合成;"边收集边散布"和对高亮像素单独溅射散景是游戏中的常见做法(RTR4 12.4 节)。游戏开发 · UE5后处理体积与效果Post Process Volumes & EffectsUE 的后处理效果(调色、色调映射、泛光、曝光、景深、运动模糊等)通过后处理体积 (Post Process Volume) 或相机设置来指定,即使关卡里没有体积,引擎也有默认的后处理设置。多个体积重叠时按优先级 (Priority) 覆盖,用混合半径 (Blend Radius) 和混合权重 (Blend Weight) 平滑过渡;Infinite Extent (Unbound) 让体积作用于整个场景。图形学GPU 内存、缓冲压缩与多重缓冲GPU Memory, Buffer Compression & Multiple Buffering带宽是稀缺资源。GPU 通过独立显存或统一内存架构 (UMA)、多级缓存与按瓦片存储提高局部性,并用基于瓦片表的无损压缩和快速清除减少渲染目标的带宽(注意:无损压缩只省带宽,不省内存)。颜色缓冲有高彩、真彩、深色三种模式;显示控制器以固定刷新率或 FreeSync/G-sync 自适应同步把颜色缓冲送到显示器;单/双/三缓冲在撕裂、等待与延迟之间取舍。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。图形学图像处理与后处理Image Processing & Post-Processing后处理是在渲染出图像后再用 GPU 对其做图像处理:把离屏缓冲当纹理,用全屏 pass 让像素着色器(或计算着色器)对每个像素采样邻域并加权求和。核心技巧包括可分离滤波、利用双线性插值减少采样、降采样、以及借助深度/法线保持边缘的(联合)双边滤波(RTR4 12.1 节)。图形学光谱渲染Spectral Rendering光谱渲染 (Spectral Rendering) 在光传输中直接处理波长,而不是 RGB 三元组。pbrt 第 4 版在每条相机光线上随机采样少数几个波长(默认 4 个),把光谱积分并入渲染本来就在做的蒙特卡洛积分;最后用颜色匹配函数估计像素的 XYZ/RGB。输入端的 RGB 颜色则通过"sigmoid 二次多项式"转换成平滑光谱。本页按 PBRT 4e 4.5、4.6.4–4.6.6 节整理。游戏美术线性工作流(Birn)Linear Workflow from Birn第 3 版 Ch8「Working in a Linear Workflow」强调:贴图、表面色、灯光、渲染与合成全程保持数字色值与真实光强的线性对应;美术灯光必须在线性空间思考,否则二次衰减、GI、叠光都会「算对了却看起来错」。游戏美术数字色彩方案与色彩平衡Color Schemes & Color Balance现以第 3 版 Ch8 为准。 章首是 线性工作流(专页);其后才是混色、色方案、色温与色彩平衡、数字色与 HDR。本页管「怎么设计颜色关系」;编码与显示链 线性工作流(Birn)、显示编码与 sRGB。游戏美术曝光与相机模拟Exposure & Camera Simulation现以第 3 版 Ch6「Cameras and Exposure」为准。 覆盖光圈/景深、快门/运动模糊、感光度与颗粒、摄影曝光(互易律、Zone System、直方图、EV、包围曝光),以及镜头瑕疵匹配。物理灯光(IES)必须配合理曝光才可信。游戏美术分层渲染与合成 PassLayered Rendering & Passes现以第 3 版 Ch11 为准。 Layers(按物体/组)与 Passes(按贡献:diffuse/spec/reflection/shadow/ambient/occlusion/beauty/lighting/GI/mask/depth)支撑后期控制;含实景底板匹配与合成色彩管理。游戏侧类比 GBuffer/AOV。游戏美术GTA V 的 Glow 与镜头光晕GTA V Glow & Lens FlaresGAT 82:GTA V 夜间红绿灯等小光源——高 HDR 自发光 + 按通道独立的色调映射保持饱和芯,外加双层旋转公告板模拟眼内眩光纹理与微动,并在关闭后处理 Bloom 时仍作回退。