中EN
概念页

天空与云渲染

Sky & Cloud Rendering

天空颜色和空气透视来自空气分子的瑞利散射,太阳周围的光晕来自近地大颗粒的米氏散射。实时方案有解析拟合模型和基于预计算透射率/散射查找表的物理模型;云则从全景贴图、粒子发展到用程序化噪声构建、光线步进的参与介质层,并以倍频程近似多次散射(RTR4 14.4 节)。

天空与空气透视

  • 两种成分:波长相关的瑞利散射(天空颜色、薄雾即空气透视),以及受天气、污染影响、与波长无关的米氏散射(太阳周围亮光晕)。
  • 早期模型从太空渲染地球大气的单次散射;O'Neil 在单 pass 着色器中从地面到太空光线步进,昂贵的积分逐顶点算在天穹上,高频的相位函数在像素着色器中算,避免插值暴露几何;也可存入纹理并分帧更新。
  • 解析模型:拟合实测天空亮度或路径追踪参考图。Preetham 模型用浑浊度(代表米氏粒子)和太阳高度角求任意方向亮度;后续改进加入光谱输出、更好的太阳周围方向性和地面反照率。计算快,但只能地面视角,不能改参数模拟外星大气或艺术化外观。
  • 查找表模型:假设地球是完美球体,外包非均匀介质大气层。参数:视点高度 rr、视线与天顶夹角余弦 μv\mu_v、太阳与天顶夹角余弦 μs\mu_s、方位面内视线与太阳夹角余弦 ν\nu。
表参数用途
透射率 TlutT_{lut}(2D)r,μvr,\mu_v给太阳、星星等天体施加大气透射率
散射 SlutS_{lut}(4D,Bruneton 与 Neyret)r,μv,μs,νr,\mu_v,\mu_s,\nu天空与空气透视
3D 散射表忽略 ν\nu更小更便宜,但地球不在大气中投影
  • nn 阶多次散射:先算单次散射表 SlutS_{lut},再用它求 Slutn−1S^{n-1}_{lut} 并加回,重复 n−1n-1 次。Bruneton-Neyret 参数化在地平线处可能有瑕疵,Yusov 提出改进变换。
  • 寒霜引擎(《极品飞车》《镜之边缘:催化剂》、FIFA)用 3D LUT,美术可调物理参数甚至模拟火星蓝色日落。参数变化需重算 LUT:可用近似积分代替步进,分帧只更新某阶的一部分并插值最近两张表,把成本摊到约 6%;米氏与瑞利散射还被烘焙到低分辨率视锥体积纹理中,相位函数仍逐像素计算以得到平滑光晕,并可逐顶点给透明物体加空气透视。

云的材质

云由水滴组成,单次散射反照率 ρ=1\rho=1,故可设 σs=σt\sigma_s=\sigma_t;实测 σt\sigma_t:层云 [0.04,0.06][0.04,0.06],积云 [0.05,0.12][0.05,0.12]。

云的渲染方法

方法做法局限
全景贴图alpha 混合到天空;Guerrette 用视觉流 (flow) 技术模拟风吹动形状和光照不能变
粒子 + 替身Harris 用粒子体积和替身旋转时离散/突变瑕疵
体积粒子Yusov:每个面向视点的粒子用 4D LUT 按光照与视线方向取散射光和透射率,适合层积云;借助光栅化顺序视图 (ROV) 保留最近 nn 层粒子深度做体积感知混合,消除突变—
网格 + 超纹理Bouthors 等:网格表示外形,超纹理在表面下一定深度加高频细节;边缘精细步进、内部视为均匀;多次散射用云表面圆盘光收集器的离线传输表加速针对孤立云
光线步进云层Schneider 与 Vos:大气中的参与介质层,两级程序化噪声——第一级给基本形状,第二级侵蚀出细节;Perlin-Worley 混合适合积云的花椰菜形状高分辨率步进昂贵
  • 体积阴影:对层内少数样本朝太阳做二次步进,可采样噪声纹理低 mip 提速去瑕疵;或每帧把太阳方向的透射率曲线编码进纹理(《最终幻想 XV》用透射率函数映射)。
  • 降分辨率:每 4×4 块只更新一个像素,其余由上一帧重投影;Hillaire 改为固定低分辨率 + 步进起点加噪声 + 指数滑动平均,收敛更快。
  • 相位函数:可存为按 θ\theta 采样的纹理;或混合两个 HG:

pdual(θ,g0,g1,w)=pdual0+w (pdual1−pdual0)p_{dual}(\theta,g_0,g_1,w)=p_{dual_0}+w\,(p_{dual_1}-p_{dual_0})

g0,g1,wg_0,g_1,w 由美术设定,同时表现主前向与后向散射,背光和迎光看都有细节。

  • 环境光:从天空立方体贴图均匀积分一个亮度;用自下而上由暗到亮的渐变近似云的自遮挡;或分上(天空)下(地面)两部分,在介质密度恒定假设下解析积分。

多次散射近似

没有多次散射,厚云只有边缘被照亮、其余发暗,显得像烟一样浑浊。Wrenninge 对 oo 个倍频程求和:

Lmultiscat(x,v)=∑n=0o−1Lscat(x,v)L_{multiscat}(\mathbf{x},\mathbf{v})=\sum_{n=0}^{o-1}L_{scat}(\mathbf{x},\mathbf{v})

第 nn 项中替换 σs′=σsan\sigma_s'=\sigma_s a^n、σe′=σebn\sigma_e'=\sigma_e b^n、p′(θ)=p(θcn)p'(\theta)=p(\theta c^n),a,b,c∈[0,1]a,b,c\in[0,1] 由用户控制,越接近 0 云越柔和、光越能"穿透"。能量守恒要求 a≤ba\le b,否则 σs\sigma_s 可能超过 σt\sigma_t。优点:步进时可即时积分各倍频程,参数少、易于美术控制;缺点:难以表现任意方向的复杂多次散射。

云与大气的交互

  • 应对云施加大气散射;逐样本计算太贵,可按代表平均云深度和透射率的单一深度施加。
  • 云覆盖增加(雨天)时,应减少云层下的太阳大气散射:降低天空对空气透视的贡献,并把穿过云的散射光加回大气,以保持画面一致。

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 下一条所说黄昏头顶蓝色的来源。

  • 天空盒只需按光线方向采样纹理;体积方法则把光线分段,每步估计内散射对最终亮度的贡献:Cfinal=T Cbase+CinC_{\text{final}}=T\,C_{\text{base}}+C_{\text{in}},TT 为大气透射率,CbaseC_{\text{base}} 是不考虑散射时的基线光(通常采样自天空盒),CinC_{\text{in}} 为内散射光。

体积云

云形状不规则,一般不用解析表示,可以用手绘 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 说每一步把内散射的贡献"加到大气的透射率上",与随后给出的 Cfinal=T Cbase+CinC_{\text{final}}=T\,C_{\text{base}}+C_{\text{in}} 不符:内散射是加到亮度上,透射率是乘到基线光上。

GPU Gems 的视角:精确大气散射(GPU Gems 2 第 16 章)

来源:Sean O'Neil《Accurate Atmospheric Scattering》;摘录 Chapter 16. Accurate Atmospheric Scattering — Sean O'Neil。相对 Hoffman/Preetham 近地常密度近似,本章实现 Nishita 1993 的指数密度大气,相机可在地面、大气层内或太空。

射线穿过大气段 A→BA\to B,在采样点 PP 做太阳→PP 出射散射再 PP→相机入射散射。Rayleigh(分子,λ−4\lambda^{-4},蓝天/红日落)与 Mie(气溶胶,灰霾与日晕;Henyey–Greenstein,g≈−0.75∼−0.999g\approx -0.75\sim-0.999)分开。光学深度 ∫exp⁡(−h/H0)\int\exp(-h/H_0),H0H_0 约大气厚度的 1/4。

嵌套积分暴力算不可实时;对光学深度 LUT 做图形分析:高度维近似 exp⁡(−4x)\exp(-4x),角度维「scale 函数」用多项式拟合(固定厚度/半径比;演示中大气厚度≈行星半径 2.5%)。天空/地面/太空 × 相机在太空/大气内分套顶点着色器;相位函数放片元以免细分伪影。常省略 Rayleigh 相位(90° 过暗)作为缺多重散射的折中。强烈依赖 HDR:1-exp(-exposure·color)。可与 雾与简易体积光照 中的体积光/神光对照:本章是行星尺度天空色,后者是局部介质。

  1. realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.5.13 节
  4. Chapter 16. Accurate Atmospheric Scattering — Sean O'Neil
  5. developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering

相关页面

图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学雾与简易体积光照Fog & Simple Volumetric Lighting这类"老派"技巧依赖经验模型,但至今仍然好用:深度雾、高度雾和局部雾体积用透射率混合雾色;光柱可用拉伸的面向相机粒子、单次散射的解析积分、平面切片,或屏幕空间径向模糊实现(RTR4 14.2 节)。图形学天空盒与固定视点技术Skyboxes & Fixed-View Techniques用图像代替三角形时,渲染代价与像素数而不是顶点数成正比。Lengyel 的"渲染谱系"从纯图像方法一直排到三角形和光线追踪。本页汇总谱系中偏图像一端的技术:限制视点移动的固定视点加速、渐进细化与重光照、天空盒、光场渲染以及精灵与分层(RTR4 13.1–13.5 节)。图形学替身与深度精灵Impostors & Depth Sprites替身 (impostor) 是把复杂物体从当前视点渲染成纹理、贴在视点朝向公告板上的表示,可在多个实例或多帧间复用以摊薄生成成本。公告板云用少量相交的镂空平面近似网格;深度精灵在纹理中加入每像素深度偏移,能与周围几何正确穿插;浮雕纹理、浮雕替身和几何图像进一步模糊了图像与网格的界线(RTR4 13.6.4、13.6.5、13.7 节)。图形学粒子系统Particle Systems粒子系统是一组按某种算法运动的小物体,用于火、烟、爆炸、水流、星系等,同时负责动画(生成、移动、变化、删除)和渲染。粒子通常渲染成公告板;难点在半透明排序、光照(逐顶点、逐像素低分辨率光照图块)以及接收/投射/自阴影(透射率溅射、傅里叶不透明度贴图、消光体积)(RTR4 13.8 节)。图形学时间重投影Temporal Reprojection重投影是在新的视点和朝向下复用前几帧已计算的样本。目的一是利用时间相干把渲染开销摊到多帧(与时间抗锯齿相关),二是当前帧来不及完成时快速生成近似帧(对 VR 防止晕动尤其重要)。分为反向重投影(从上一帧收集)和正向重投影(把上一帧散布到当前帧)(RTR4 12.2 节)。游戏开发 · UE5天空大气与体积云Sky Atmosphere & Volumetric Clouds天空大气 (Sky Atmosphere) 组件是基于物理的天空与大气渲染:模拟瑞利散射 (Rayleigh)、米氏散射 (Mie) 和臭氧吸收,天色随太阳高度变化,并提供带行星曲率的空气透视,可以从地面平滑过渡到外太空。体积云 (Volumetric Cloud) 组件用材质驱动的三维体积纹理做光线步进,多次散射用若干「八度」近似,云的阴影可以用光线步进或 Beer 阴影贴图。游戏数学零散射与透射率估计Null Scattering & Transmittance Estimation透射率 Tr=e^{-\tau} 在非均匀介质里没有解析解。直接估计光学厚度 \tau 再取指数会因 Jensen 不等式产生偏差;零散射 (null scattering) 用一个常数上界(majorant)\sigma{maj} 把介质"填满"成均匀介质,得到可无偏采样的积分方程,由此推出 next-flight、比率追踪 (ratio tracking) 和 delta 追踪 (delta tracking) 等估计器。本页对应 PBRT 4e 11.2 与 11.4.3。图形学分形布朗运动Fractional Brownian Motion分形布朗运动 (fBm) / 分形噪声:把多「八度 (octave)」噪声叠加——频率按空隙度 (lacunarity) 步进升高,振幅按增益 (gain) 衰减——得到跨尺度自相似细节。变体包括湍流(绝对值尖谷)、脊状噪声、乘性/多重分形,以及用噪声扭曲采样坐标的域扭曲 (domain warping)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原