在顶级电影特效中,为了渲染一帧带有水体飞沫的复杂画面,往往需要消耗几千个线程小时的算力;而在以每秒60帧运行的游戏里,留给渲染整张画面——包括几何体、光照、阴影和后处理——的总时间只有16.6毫秒,特效能分到的时间通常被严格限制在2毫秒左右。这高达十个数量级的算力差距,直接决定了游戏处理水、火和烟雾的根本逻辑:游戏引擎从来没有真正去计算流体物理,而是在想尽办法“演得像”。
这种“难做”首先源于游戏引擎底层架构与流体物理特性之间的天然冲突。传统游戏引擎是围绕“物体拥有固定表面”这一假设搭建的。无论一个三维角色多么复杂,本质上都是由三维网格面片和骨骼皮囊构成的结构。然而水、火、烟雾等现象属于体积介质,它们没有固定的表面和拓扑结构,时刻都在发生拆分、融合与形态剧变。

从物理与数学层面来看,描述流体运动的核心是纳维-斯托克斯(Navier-Stokes)方程。方程中的非线性对流项导致了极具混沌特征的湍流现象,至今数学界都没有找到它在三维空间下的通用解析解。在工程实现中,开发者只能依靠欧拉法(网格划分)或拉格朗日法(粒子模拟)进行数值逼近,而这种逼近的计算开销会随着空间分辨率呈三次方暴涨。为了表现毫米级的浪花飞沫或火苗卷曲,所需要的网格或粒子数量极易突破亿级,这在实时渲染中是无法承受的负担。尽管早在1999年,相关算法就已证明实时流体解算在数学上可行,但在游戏可接受的分辨率下,真实解算的视觉质量依然无法令人满意。
因此,几十年来游戏行业普遍选择绕开真实模拟,采用各种巧妙的近似手法。
对于水体而言,绝大多数3A大作呈现的壮丽大海,本质上并不是三维流体,而是基于快速傅里叶变换(FFT)的高度场算法。水面被简化为一张会上下起伏的二维网格“布”,通过叠加无数不同振幅和方向的正弦波来模拟海浪。这种做法极其高效,但也带来了天然的局限:在较高视角下容易产生周期性的贴图重复感;水面只能上下起伏,无法做出真正向前卷曲并拍碎的浪头,只能依靠贴图来伪装泡沫;此外,这张“布”本身无法自动感知场景中的角色,玩家落水产生的涟漪和飞溅都需要额外叠加多层交互系统来掩饰。再加上水面需要同时处理折射、反射、次表面散射等复杂光学效果,目前普遍使用的屏幕空间反射技术容易在视角转动时丢失镜头外物体的倒影,导致水面瞬间穿帮。

至于火焰,其在游戏里的实现则更加依赖“欺骗”。主流做法至今依然是使用序列帧贴图(Flipbook)。特效师预先烘焙好一段火焰燃烧的数十张连续小图,打包成一张大贴图,然后在引擎里利用粒子系统按帧播放,并配合噪声纹理扭曲坐标。这种方法之所以能沿用多年,是因为火焰自身发光、边缘模糊且无固定形状,恰好掩盖了平面贴图缺乏真实深度的缺陷。它的代价在于火焰只是一段预先录制好的视觉动画,无法与周围环境产生真正的物理交互,例如根据风向动态弯曲或真实地蔓延点燃旁边的物体。

而在烟雾和云朵的制作上,由于体积介质具有光线吸收和散射的特性,开发者需要使用光线步进(Ray Marching)技术进行体积渲染。引擎必须从摄像机向每个像素发射光线穿过烟雾,沿着光线多次采样密度并计算光的衰减与散射。由于计算量巨大,游戏不得不采用降低分辨率、空间体素化以及跨帧复用等降采样补丁,这使得烟雾极易产生穿墙、与半透明物体交错时的排序错乱以及边缘硬切等瑕疵。
除了技术本身的近似缺陷,人类大脑对自然现象的敏感度也加剧了制作难度。人类每天都在观察日常的水火烟,对它们的运动规律积累了极强的视觉先验。一个机器人模型的动作哪怕偏差10%,玩家可能很难察觉,但一团烟雾或水流的动态只要有10%的不自然,就会立刻触发“不真实感”。
在实际开发中,单个特效的渲染或许尚可控制,真正的挑战在于多系统交互带来的性能暴涨。例如,烟雾既要遮挡场景光线,又要被环境光照亮;水体需要实时识别每一个入水物体的物理碰撞;而在移动端硬件架构下,大量的半透明粒子叠加会导致极高的像素重复着色(Overdraw)开销,直接拖垮帧率。

近年来,虽然图神经网络(GNN)等人工智能技术在流体模拟的研究中展现出潜力,但在实时游戏端,神经网络推理本身的算力消耗依然较高,且难以保证物理上的严格守恒,容易出现体积凭空突变的异常。目前,AI和实时流体求解器更多是作为制作端工具,用于加速美术人员的素材烘焙与迭代,而非直接在玩家设备上跑实时解算。
在16.6毫秒的时间限制下,游戏里的水、火与烟雾从来就不是物理学的精准再现,而是一场由数学算法、光学技巧和视觉心理学共同构筑的魔术。它的难点不在于方程本身,而在于如何在极其有限的算力下,将一堆各自成立的近似补丁缝合在一起,并在人类挑剔的眼睛注视下保持不露馅。