天空与云渲染
Sky & Cloud Rendering
天空颜色和空气透视来自空气分子的瑞利散射,太阳周围的光晕来自近地大颗粒的米氏散射。实时方案有解析拟合模型和基于预计算透射率/散射查找表的物理模型;云则从全景贴图、粒子发展到用程序化噪声构建、光线步进的参与介质层,并以倍频程近似多次散射(RTR4 14.4 节)。
天空与空气透视
- 两种成分:波长相关的瑞利散射(天空颜色、薄雾即空气透视),以及受天气、污染影响、与波长无关的米氏散射(太阳周围亮光晕)。
- 早期模型从太空渲染地球大气的单次散射;O'Neil 在单 pass 着色器中从地面到太空光线步进,昂贵的积分逐顶点算在天穹上,高频的相位函数在像素着色器中算,避免插值暴露几何;也可存入纹理并分帧更新。
- 解析模型:拟合实测天空亮度或路径追踪参考图。Preetham 模型用浑浊度(代表米氏粒子)和太阳高度角求任意方向亮度;后续改进加入光谱输出、更好的太阳周围方向性和地面反照率。计算快,但只能地面视角,不能改参数模拟外星大气或艺术化外观。
- 查找表模型:假设地球是完美球体,外包非均匀介质大气层。参数:视点高度 、视线与天顶夹角余弦 、太阳与天顶夹角余弦 、方位面内视线与太阳夹角余弦 。
| 表 | 参数 | 用途 |
|---|---|---|
| 透射率 (2D) | 给太阳、星星等天体施加大气透射率 | |
| 散射 (4D,Bruneton 与 Neyret) | 天空与空气透视 | |
| 3D 散射表 | 忽略 | 更小更便宜,但地球不在大气中投影 |
- 阶多次散射:先算单次散射表 ,再用它求 并加回,重复 次。Bruneton-Neyret 参数化在地平线处可能有瑕疵,Yusov 提出改进变换。
- 寒霜引擎(《极品飞车》《镜之边缘:催化剂》、FIFA)用 3D LUT,美术可调物理参数甚至模拟火星蓝色日落。参数变化需重算 LUT:可用近似积分代替步进,分帧只更新某阶的一部分并插值最近两张表,把成本摊到约 6%;米氏与瑞利散射还被烘焙到低分辨率视锥体积纹理中,相位函数仍逐像素计算以得到平滑光晕,并可逐顶点给透明物体加空气透视。
云的材质
云由水滴组成,单次散射反照率 ,故可设 ;实测 :层云 ,积云 。
云的渲染方法
| 方法 | 做法 | 局限 |
|---|---|---|
| 全景贴图 | alpha 混合到天空;Guerrette 用视觉流 (flow) 技术模拟风吹动 | 形状和光照不能变 |
| 粒子 + 替身 | Harris 用粒子体积和替身 | 旋转时离散/突变瑕疵 |
| 体积粒子 | Yusov:每个面向视点的粒子用 4D LUT 按光照与视线方向取散射光和透射率,适合层积云;借助光栅化顺序视图 (ROV) 保留最近 层粒子深度做体积感知混合,消除突变 | — |
| 网格 + 超纹理 | Bouthors 等:网格表示外形,超纹理在表面下一定深度加高频细节;边缘精细步进、内部视为均匀;多次散射用云表面圆盘光收集器的离线传输表加速 | 针对孤立云 |
| 光线步进云层 | Schneider 与 Vos:大气中的参与介质层,两级程序化噪声——第一级给基本形状,第二级侵蚀出细节;Perlin-Worley 混合适合积云的花椰菜形状 | 高分辨率步进昂贵 |
- 体积阴影:对层内少数样本朝太阳做二次步进,可采样噪声纹理低 mip 提速去瑕疵;或每帧把太阳方向的透射率曲线编码进纹理(《最终幻想 XV》用透射率函数映射)。
- 降分辨率:每 4×4 块只更新一个像素,其余由上一帧重投影;Hillaire 改为固定低分辨率 + 步进起点加噪声 + 指数滑动平均,收敛更快。
- 相位函数:可存为按 采样的纹理;或混合两个 HG:
由美术设定,同时表现主前向与后向散射,背光和迎光看都有细节。
- 环境光:从天空立方体贴图均匀积分一个亮度;用自下而上由暗到亮的渐变近似云的自遮挡;或分上(天空)下(地面)两部分,在介质密度恒定假设下解析积分。
多次散射近似
没有多次散射,厚云只有边缘被照亮、其余发暗,显得像烟一样浑浊。Wrenninge 对 个倍频程求和:
第 项中替换 、、, 由用户控制,越接近 0 云越柔和、光越能"穿透"。能量守恒要求 ,否则 可能超过 。优点:步进时可即时积分各倍频程,参数少、易于美术控制;缺点:难以表现任意方向的复杂多次散射。
云与大气的交互
- 应对云施加大气散射;逐样本计算太贵,可按代表平均云深度和透射率的单一深度施加。
- 云覆盖增加(雨天)时,应减少云层下的太阳大气散射:降低天空对空气透视的贡献,并把穿过云的散射光加回大气,以保持画面一致。
GEA 的视角:天空、体积大气与体积云(卷 II 12.5.13)
天空纹理、天空穹顶与天空盒
- 天空细节丰富但距离极远,不能按真实情况建模(卷 II 12.5.13)。
- 最简单的做法:在画任何 3D 几何之前,用天空纹理填满帧缓冲,纹素与像素大致 1:1,随相机旋转、滚动;画天空时把所有像素深度设为最大值,保证 3D 元素总在它之上。街机《Hydro Thunder》就是这样画天空的。
- 现代平台像素着色贵,天空常改为最后画:先把 z-buffer 清成最大值,画场景,最后开启 z 测试、关闭 z 写入、用比最大值小 1 的深度画天空,这样只在没被地形、建筑、树木挡住的像素上运行天空着色器。
- 可以向任意方向看的游戏用天空穹顶或天空盒,中心始终在相机位置,看起来位于无穷远;与天空纹理一样先画、深度设为最大,所以盒子本身可以很小,只要填满帧缓冲即可(见 天空盒与固定视点技术)。
- 注意顺序:GEA 对天空纹理给出了"现代平台最后画、省像素着色"的做法,但讲天空盒时仍写作"在任何 3D 几何之前渲染",没有说明天空盒是否也适用最后画的优化。
体积光照与光线步进
- 现代开放世界游戏(GEA 举《地平线 西之绝境》和《荒野大镖客:救赎 2》)只把星星、月亮等地外天体和远处的薄云放在天空盒里,大气和低层云用体积方法渲染,再合成到天空盒和场景之上。体积方法输入的是固定的大气属性,与太阳角度无关,所以特别适合程序化生成不同时间的天空,也能做三维云和动态天气(卷 II 12.5.13.1)。
- 体积渲染靠光线步进 (ray marching):把穿过参与介质的长光线切成短段,在每个中间点求采样函数。光线步进可以在像素着色器里与光栅化结合,是向完全光线追踪迈出的"半步",也可以用在完整的随机光线追踪中处理参与介质。
体积大气
- 阳光穿过大气有三种行为:被吸收;外散射(本来会射到相机的光子偏离);内散射(本来不会射到相机的光子被偏折过来)。吸收与外散射合称消光,消光后剩余光与总入射光之比为透射率,可以看成介质的"alpha"。大气散射是各向异性的,用类似 BRDF 的相位函数建模(卷 II 12.5.13.2,见 参与介质与体积散射)。
- 从相机反向沿光线看向太空:没有内散射,天空像夜空一样黑。白天的蓝和黄昏的橙紫都来自内散射:空气分子产生瑞利散射,对短波(蓝)散射和吸收更强,所以白天高角度一片蓝、日落低角度光路长而偏红;气溶胶产生米氏散射,对波长不敏感、强烈前向散射,让太阳圆盘很突出,云朝太阳方向的"银边"也来自它;臭氧造成黄昏时头顶的蓝色。
原书问题(12.5.13.2):GEA 说瑞利散射"散射并吸收"短波长更多。空气分子的瑞利散射是弹性散射,可见光波段几乎没有吸收;日落偏红是因为长光路上蓝光被外散射出视线,而不是被吸收(Wikipedia "Rayleigh scattering";Bruneton & Neyret, "Precomputed Atmospheric Scattering", EGSR 2008 中空气分子只有散射系数、吸收系数为 0)。大气中真正对可见光有显著吸收的是臭氧(Chappuis 吸收带),这正是 GEA 下一条所说黄昏头顶蓝色的来源。
- 天空盒只需按光线方向采样纹理;体积方法则把光线分段,每步估计内散射对最终亮度的贡献:, 为大气透射率, 是不考虑散射时的基线光(通常采样自天空盒), 为内散射光。
体积云
云形状不规则,一般不用解析表示,可以用手绘 2D 纹理加程序化 3D 噪声,也可以用手工制作的体素网格,映射到世界空间并放在固定的高度范围内。渲染时对每个像素做光线步进采样体积云模型;光线步进很贵,每像素每帧的样本数很有限,因此通常用时间采样:跨多帧收集样本再混合(卷 II 12.5.13.3)。这与本页「云的渲染方法」一致。
原书小问题
- 12.5.13.1 把游戏名写成 "Horizon Zero Dawn: Forbidden West";实际是两部游戏《地平线 零之曙光》(Horizon Zero Dawn) 和续作《地平线 西之绝境》(Horizon Forbidden West)。
- 12.5.13.2 说每一步把内散射的贡献"加到大气的透射率上",与随后给出的 不符:内散射是加到亮度上,透射率是乘到基线光上。
GPU Gems 的视角:精确大气散射(GPU Gems 2 第 16 章)
来源:Sean O'Neil《Accurate Atmospheric Scattering》;摘录 Chapter 16. Accurate Atmospheric Scattering — Sean O'Neil。相对 Hoffman/Preetham 近地常密度近似,本章实现 Nishita 1993 的指数密度大气,相机可在地面、大气层内或太空。
射线穿过大气段 ,在采样点 做太阳→ 出射散射再 →相机入射散射。Rayleigh(分子,,蓝天/红日落)与 Mie(气溶胶,灰霾与日晕;Henyey–Greenstein,)分开。光学深度 , 约大气厚度的 1/4。
嵌套积分暴力算不可实时;对光学深度 LUT 做图形分析:高度维近似 ,角度维「scale 函数」用多项式拟合(固定厚度/半径比;演示中大气厚度≈行星半径 2.5%)。天空/地面/太空 × 相机在太空/大气内分套顶点着色器;相位函数放片元以免细分伪影。常省略 Rayleigh 相位(90° 过暗)作为缺多重散射的折中。强烈依赖 HDR:1-exp(-exposure·color)。可与 雾与简易体积光照 中的体积光/神光对照:本章是行星尺度天空色,后者是局部介质。
出处
- realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.5.13 节
- Chapter 16. Accurate Atmospheric Scattering — Sean O'Neil
- developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering