熔岩行星图形学 · 第 1 轨道
双星 G5 V + B8 V · 轨道半径 6.7 万 km
HDR 与后期处理:让画面“发光”的秘密
为什么恒星看起来会发光?答案是高动态范围渲染、泛光和色调映射。聊聊这个博客的后期处理管线。
- 发布
- 字数
- 556
- 阅读
- 1 分钟
在屏幕上,最亮的颜色就是纯白 #ffffff。可是恒星比一张白纸亮了不知多少个数量级——如果只能用 0 到 1 表示亮度,恒星和白纸就没有区别了。这就是高动态范围(HDR)渲染要解决的问题。
在浮点缓冲里渲染
这个博客把场景渲染到一张半精度浮点的帧缓冲里。在这里,颜色值可以远大于 1:恒星表面可能是 8,吸积盘最亮处可能是 20。
<EffectComposer multisampling={8} frameBufferType={HalfFloatType}>
{/* ... 各种后期效果 ... */}
</EffectComposer>泛光(Bloom)
亮度超过阈值的像素,会被提取出来、逐级降采样模糊、再叠加回原图。于是亮的东西周围会“溢出”一圈光晕,就像相机镜头和人眼真实的表现一样。
因为是在 HDR 空间里做的,越亮的东西光晕越大——恒星的光晕远大于行星的高光,这是在 LDR 空间里做不到的。
色调映射(Tone Mapping)
最终显示器只能显示 0 到 1,所以需要一条曲线把 HDR 的亮度“压”回去。常见的有 Reinhard、ACES,以及这里使用的 AgX:
AgX 的优点是在极亮处会自然地“褪色”到白色,而不是像 ACES 那样让饱和的颜色变得刺眼。蓝巨星的核心是白的,边缘才是蓝的——这正是我们想要的效果。
其他点缀
| 效果 | 作用 |
|---|---|
| 体积光(God Rays) | 从恒星方向沿屏幕径向模糊,产生光束 |
| 镜头光晕 | 模拟镜头内部反射产生的光斑与光环 |
| 色差 | 画面边缘 RGB 轻微分离,跃迁时会加强 |
| 胶片颗粒 | 打破数字画面过于干净的质感 |
| 暗角 | 把视线引向画面中央 |
顺序很重要
后期效果的顺序会显著影响结果。一个基本原则是:需要 HDR 信息的效果(泛光、体积光)放在色调映射之前,纯粹风格化的效果(颗粒、暗角)放在之后。
好的后期处理像调味料:放对了你不会注意到它,没放你会觉得少了点什么。