体积云差分视差尺度及其在实时游戏渲染中的应用


摘要

体积云(volumetric clouds)在视觉上具有明显的三维体积感,但地面观察者在日常尺度内移动时,云的整体外观往往几乎不发生可察觉变化。本文以差分视差(differential parallax)为核心量,建立一个简化的几何尺度模型,说明云内部前后特征的相对角位移近似满足 ΔθdΔL/[L(L+ΔL)]\Delta\theta \approx d \cdot \Delta L / [L(L+\Delta L)],在薄云与小角条件下进一步化为 ΔθdΔL/L2\Delta\theta \approx d \cdot \Delta L / L^2。基于人眼角分辨率、代表性云体尺寸和玩家移动速度,本文估算出:要使典型低层积云的结构发生显著可见重排,观察者通常需要移动数百米到数公里。由此可以解释为何实时游戏中的远云可以大量依赖时间复用(temporal reprojection)、距离分级细节(level of detail, LOD)和相机中心化天空表示。进一步地,本文比较压缩有限世界、1:1 真实世界与无限程序化世界三种开放世界范式,讨论其云锚定方式、视差真实性、浮点精度和渲染成本之间的工程取舍。

关键词

体积云;差分视差;实时渲染;ray marching;temporal reprojection;LOD;开放世界尺度;浮点精度

1. 引言

云体在图像中常呈现出强烈的体积感。这种体积感并不主要来自双眼视差(binocular disparity),而更多来自体散射(volumetric scattering)、消光(extinction)、自遮挡(self-occlusion)、自阴影(self-shadowing)以及轮廓明暗等单眼线索。与此同时,一个日常经验是:观察者在地面步行或骑行时,远处云的形状几乎不因观察位置改变而发生明显变化。

本文讨论的问题是:观察者需要移动多远,才能使一团体积云的内部结构发生可见的“换角度”变化?这个问题不仅是几何光学问题,也直接关联到实时图形学中的体积云渲染优化。若玩家移动导致的云结构变化本来就低于感知阈值,那么渲染系统便可以在相当长的时间窗口内复用云的低频形状和光照结果。

本文不是气象云微物理模型,也不试图预测真实云的形成、湍流演化或降水过程。本文的目标更窄:用一个可计算的尺度模型解释云视觉视差,并把该模型转化为实时游戏渲染中的工程判断。

2. 几何模型:差分视差

设云中心到观察者的距离为 LL,云沿视线方向的厚度为 ΔL\Delta L,云在垂直视线方向上的横向尺度为 WW。为了估算云内部结构的相对错动,可取云的近侧特征点 P1P_1 与远侧特征点 P2P_2,二者距离分别为 LLL+ΔLL+\Delta L。观察者沿垂直于初始视线的方向横向移动 dd,则两个特征点的角位移差为:

Δθ(d)=arctan(d/L)arctan(d/(L+ΔL))(1)\Delta\theta(d) = \arctan(d/L) - \arctan(d/(L+\Delta L)) \tag{1}

2.1 小角近似与适用范围

式(1)是更精确的一维几何表达。若 dLd \ll LΔL/L\Delta L/L 不大,则 arctanxx\arctan x \approx x,得到式(2)。原始博客式写法 ΔθdΔL/L2\Delta\theta \approx d \cdot \Delta L / L^2 是式(2)在 ΔLL\Delta L \ll L 时的进一步近似。因此,凡是 ΔL/L\Delta L/L 达到 1/31/31/21/2 的浅近云场景,使用 L2L^2 分母会系统性低估所需位移。本文后续表格统一采用 L(L+ΔL)L(L+\Delta L) 分母,以避免这一误差。

ΔθdΔL/[L(L+ΔL)]dΔL/L2(2)\Delta\theta \approx d \cdot \Delta L / [L(L+\Delta L)] \approx d \cdot \Delta L / L^2 \tag{2}

3. 可见性阈值与数值估算

正常 20/20 视力的最小分辨角(minimum angle of resolution, MAR)通常约为 1 弧分;这是高对比、中心视野、理想测试条件下的阈值 [1]。云边界低对比且持续演化,因此 1 弧分在本文中只作为理想可察觉下限,而非保证可稳定感知的阈值。

本文采用三个工程阈值:第一,Δθ\Delta\theta 达到 αmin=2.9×104\alpha_{\min}=2.9\times10^{-4} rad(约 1 弧分)时,记为“理想可察觉”;第二,Δθ\Delta\theta 达到云横向角尺度 W/LW/L 的 10% 时,记为“明显变化”;第三,达到 30% 时,记为“结构性重排”。10% 与 30% 不是视觉科学常数,而是用于工程估算的经验阈值。由式(2)反解可得:

ddetect=αminL(L+ΔL)/ΔL,dβ=βW(L+ΔL)/ΔL(3)d_{\mathrm{detect}} = \alpha_{\min} \cdot L(L+\Delta L)/\Delta L,\quad d_{\beta} = \beta \cdot W(L+\Delta L)/\Delta L \tag{3}

3.1 代表性云体场景

低层云通常位于地表至约 2 km 的低云层范围,积云(Cumulus)和积雨云(Cumulonimbus)均属于低云族或从低层向上发展的云类 [3][4]。表 1 中的 LLWWΔL\Delta L 不是普适气象常数,而是用于尺度分析的代表性数量级。

表 1 基于 L(L+ΔL)L(L+\Delta L) 分母修正后的代表性位移阈值

场景LLWWΔL\Delta L理想可察觉明显变化结构性重排
头顶低层积云1.5 km0.5 km0.5 km1.7\approx 1.7 m200\approx 200 m600\approx 600 m
30°30° 仰角小积云3 km1 km1 km3.5\approx 3.5 m400\approx 400 m1.2\approx 1.2 km
远处中等积云10 km1 km1 km32\approx 32 m1.1\approx 1.1 km3.3\approx 3.3 km
远处积雨云20 km5 km5 km29\approx 29 m2.5\approx 2.5 km7.5\approx 7.5 km
注:表中“明显变化”和“结构性重排”分别采用云横向角尺度的 10% 与 30% 作为经验阈值。数值为数量级估算。

3.2 双眼视差的贡献

成年人瞳距(interpupillary distance, IPD)常取约 63 mm 作为数量级估计 [2]。对于 L=3L=3 km、ΔL=1\Delta L=1 km 的云体,双眼产生的差分视差约为 bΔL/[L(L+ΔL)]5.3×106b \cdot \Delta L / [L(L+\Delta L)] \approx 5.3 \times 10^{-6} rad,即约 1.1 角秒。该量级远小于普通空间分辨阈值,也难以在自然云体这种低对比、非刚性纹理上提供稳定深度匹配。因此,数公里外云体的立体感主要来自单眼光照和遮挡线索,而不是双眼视差。

4. 时间尺度:玩家移动与风驱动变化

当观察者横向速度为 vv 时,玩家移动引入的差分视差角速度近似为式(4)。相对地,风导致的整团云平移在天空中的表观角速度近似为 u/Lu/L,其中 uu 是云体随风平移的水平速度。二者不是同一个量:前者描述云内部前后层的相对错动,后者描述云整体在天空坐标中的漂移。原始文档中将二者放在同一表格中比较是可行的,但必须明确它们的定义不同。

ωparallaxvΔL/[L(L+ΔL)],ωadvectionu/L(4)\omega_{\mathrm{parallax}} \approx v \cdot \Delta L / [L(L+\Delta L)],\quad \omega_{\mathrm{advection}} \approx u/L \tag{4}

表 2 玩家移动差分视差与风驱动整体漂移的角速度比较

来源速度示例参数角速度量级解释
步行1.4 m/sL=3L=3 km, ΔL=1\Delta L=1 km0.0067°/s\approx 0.0067\,\mathrm{°/s}
跑步5 m/sL=3L=3 km, ΔL=1\Delta L=1 km0.024°/s\approx 0.024\,\mathrm{°/s}仍较弱
汽车30 m/sL=3L=3 km, ΔL=1\Delta L=1 km0.14°/s\approx 0.14\,\mathrm{°/s}可见性提高
巡航飞机250 m/sL=5L=5 km, ΔL=1\Delta L=1 km0.48°/s\approx 0.48\,\mathrm{°/s}连续视差明显
高空风平移5–30 m/sL=3L=3 km整团漂移 0.10\approx 0.100.57°/s0.57\,\mathrm{°/s}通常主导地面观感
## 5. 游戏世界尺度与云锚定方式

开放世界游戏通常同时包含叙事尺度、坐标尺度和渲染尺度。叙事尺度描述游戏想表现的地理范围;坐标尺度是引擎实际使用的米制距离;渲染尺度则决定天空、云层、雾和远景是否与世界坐标严格绑定。

若一朵真实高度约 1.5 km 的云被固定在世界坐标中,玩家横向移动 10 km 后,它的仰角将从接近头顶变为 arctan(1.5/10)8.5°\arctan(1.5/10) \approx 8.5°。这已不属于小角差分视差,而是明显的几何扫掠。因此,在压缩有限开放世界中,若地图只有十公里量级,却叙事上代表数百公里,远云通常不能简单采用真实高度的世界锚定(world-anchored)方案,否则会暴露尺度压缩。

公开逆向研究显示,Red Dead Redemption 2 的天空与云相关 GPU 计算非常显著,并且其环境 cubemap 会从相机位置生成 [7]。这并不等同于官方证明“所有主视图云内容都随相机平移”,但它支持一种保守判断:RDR2/GTA5 这类压缩开放世界至少在远云与天空表现上倾向于相机中心化或近似无穷远(camera-centered / effectively infinite-distance)的策略,以压制不合尺度的平移视差。

5.1 三种世界范式

第一类是压缩有限世界,例如 RDR2/GTA5。它们为了叙事密度压缩地理尺度,因而更适合把远云视为低视差天空内容,由天气、风场和昼夜光照驱动变化。

第二类是 1:1 真实世界,例如 Microsoft Flight Simulator。其世界重建依赖 Bing 卫星/航拍数据与 Azure 云端流式数据 [8],并提供实时天气模式,包括风速、温度、湿度、降水等 [9]。在这种尺度自洽的世界中,真实高度云层、飞机速度和世界锚定云场之间是兼容的。

第三类是无限程序化世界,例如 Minecraft。原版云是客户端图形效果(client-side graphical effect),在 192 至 196 层之间向西移动,并非服务器物理天气实体;但其位置在视觉上由坐标和时间决定,而不是将云图案作为内容绑定到相机 [10]。因此 Minecraft 不需要通过内容相机锚定来隐藏世界尺度矛盾。它真正需要处理的是大坐标下的浮点精度问题。

6. 体积云渲染方法与成本

实时体积云通常以云盒(cloud volume)或大气体积域的形式表示。渲染时,视线从相机出发穿过体积区域,沿光线进行步进采样(ray marching),每个采样点查询三维噪声(3D noise,如 Perlin/Worley/fBm 组合)或气象密度场,并累积消光与散射。Guerrilla Games 在 Horizon Zero Dawn 的体积云方案中明确提出了可美术控制、天气集成和约 2 ms GPU 预算等目标 [5]。后续研究也强调,体积云之所以昂贵,主要因为 ray marching 步数和时间复用策略之间存在直接权衡 [6]。

若采用直观的主光线步进与简化太阳方向步进模型,单帧成本可粗略表示为:

CostP×N×(1+M)×cnoise(5)\mathrm{Cost} \approx P \times N \times (1+M) \times c_{\mathrm{noise}} \tag{5}

其中 PP 为参与体积云计算的像素数,NN 为主光线采样步数,MM 为每个采样点用于估算太阳方向遮蔽或散射的附加步数,cnoisec_{\mathrm{noise}} 为噪声查询与相函数计算的单位成本。式(5)不是所有引擎的严格成本公式,而是用于说明 ray marching 嵌套采样为何昂贵的近似模型。

表 3 三类实时云渲染方案的成本与锚定方式

方法每像素主采样自遮挡/光照相对成本典型锚定方式
原版/几何云0 或极少无或极简极低客户端坐标/时间函数
薄层噪声云NN简化低至中世界空间噪声 + 相机相对渲染
真体积云N32N \approx 32128128M4M \approx 41616 或 LUT/近似世界锚定密度场 + 浮动原点
### 6.1 三个实现层级

层级 0 是几何或伪体积云,例如 Minecraft 原版云段。其主要成本来自几何绘制与简单透明处理,不进行真实体积积分。

层级 1 是薄层噪声云(2D or slab-based shader clouds)。这类方法在固定高度附近对噪声层进行少量采样,能表现云层明暗和边缘变化,但缺少充分的深度自遮挡。

层级 2 是真体积云(fully volumetric clouds)。它在一定高度范围内执行多步 ray marching,并可加入多次散射近似、太阳方向自阴影或预积分查找表。该层级质量最高,但也最依赖半分辨率渲染、时间重投影、抖动采样、空步跳跃(empty-space skipping)和提前终止(early ray termination)。

7. 由标度律导出的优化策略

第一,时间重投影。当地面玩家慢速移动时,ωparallax\omega_{\mathrm{parallax}} 很小,十几帧内云内部结构的相对角位移可能仍低于一个像素。因此,半分辨率或四分辨率渲染加 temporal reprojection 是有物理依据的,而不仅是经验优化。

第二,距离 LOD。差分视差随距离近似按 1/L21/L^2 衰减。近场云需要完整步进,中场可降低采样率并依赖重投影,远场可退化为 impostor、天空穹顶纹理或低频体积表示。

第三,形状与光照解耦。远云的体积感主要由单眼线索提供,因此密度形状场可以低频更新,光照查找表或大气散射项可按太阳高度、天气状态等更低频变量更新。

第四,速度自适应采样。在 Minecraft 鞘翅飞行或飞行模拟中,玩家速度从步行量级跃迁到航空量级,ωparallax\omega_{\mathrm{parallax}} 不再可忽略。渲染器应根据相机速度、云高、云厚和屏幕残差提高近场采样率。

第五,坐标精度管理。Minecraft Wiki 记载,Bedrock Edition 的许多位置计算使用 32 位浮点数,并在高坐标处产生明显精度问题;Java Edition 对实体位置等使用 64 位浮点数,但渲染阶段仍需面对 GPU float32 限制 [11][12]。因此,渲染器通常应在相机相对空间中步进,同时在噪声采样时采用世界坐标取模、分块原点或双精度 CPU / 单精度 GPU 混合策略。

8. 局限性

本文模型忽略了云体的非刚性演化、湍流、光照多次散射、遮挡复杂性和实际天气系统的空间相关性。表格中的云体尺寸和风速仅用于数量级分析,不应解读为气象分类标准。对于具体游戏引擎,本文基于公开资料与视觉推断进行讨论;除非有官方技术论文或 RenderDoc 帧捕获证据,不能把这些推断视为对引擎内部实现的最终证明。

9. 结论

体积云“看起来立体但不随人走几步而明显变形”的核心原因,是云内部前后特征的差分视差随距离平方快速衰减。对地面慢速观察者,玩家移动造成的云结构重排通常弱于风、密度演化和光照变化。这个物理事实为实时图形学中的 temporal reprojection、距离 LOD、形状/光照解耦与速度自适应采样提供了定量依据。

在游戏世界中,云的物理真实性并非只由渲染技术决定,还取决于世界尺度是否自洽。压缩有限世界倾向于使用相机中心化的远云表示来隐藏尺度矛盾;1:1 真实世界可以承受真实高度的世界锚定体积云;无限程序化世界则可以保留真实视差,但必须解决大坐标浮点精度问题。

参考文献

[1] M. Kalloniatis and C. Luu, “Visual Acuity,” Webvision: The Organization of the Retina and Visual System. University of Utah / Webvision, 2007. https://www.webvision.pitt.edu/book/part-viii-psychophysics-of-vision/visual-acuity/

[2] Cleveland Clinic, “Pupillary Distance: What It Is & How To Measure,” 2026. https://my.clevelandclinic.org/health/articles/pupillary-distance

[3] World Meteorological Organization, International Cloud Atlas: “Levels.” https://cloudatlas.wmo.int/some-useful-concepts-levels.html

[4] NOAA JetStream, “The Four Core Types of Clouds,” National Oceanic and Atmospheric Administration, 2023. https://www.noaa.gov/jetstream/clouds/four-core-types-of-clouds

[5] Guerrilla Games, “The Real-Time Volumetric Cloudscapes of Horizon Zero Dawn,” 2015. https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn

[6] A. Toft, H. Bowles, and D. Zimmermann, “Optimisations for Real-Time Volumetric Cloudscapes,” arXiv:1609.05344, 2016. https://arxiv.org/abs/1609.05344

[7] imgEs, “Graphics Study: Red Dead Redemption 2,” 2020. https://imgeself.github.io/posts/2020-06-19-graphics-study-rdr2/

[8] Xbox Wire, “See the World in Microsoft Flight Simulator,” Microsoft / Xbox, 2019. https://news.xbox.com/en-us/2019/09/30/microsoft-flight-simulator-preview/

[9] Xbox Wire, “The Biggest World Update Ever for Microsoft Flight Simulator Is Also Its Best Yet,” Microsoft / Xbox, 2024. https://news.xbox.com/en-us/2024/07/24/biggest-world-update-ever-microsoft-flight-simulator-best-yet/

[10] Minecraft Wiki, “Cloud.” https://minecraft.wiki/w/Cloud

[11] Minecraft Wiki, “Java Edition distance effects.” https://minecraft.wiki/w/Java_Edition_distance_effects

[12] Minecraft Wiki, “Bedrock Edition distance effects.” https://minecraft.wiki/w/Bedrock_Edition_distance_effects