游戏中的体积流体技术

伴随着Games 103的推出,非常欣喜地看到越来越多的学生群体和活跃在前沿的业内人士开始重视"基于物理的计算机动画"技术在游戏开发中的应用,开发者也不再局限于通过序列帧或者Flowmap的方式去模拟流体现象,而是基于真实的流体力学还原其运动规律。另一方面体积渲染,无论是云,还是雾,做为游戏美术添彩的重要一笔,亦或是彰显技术实力的重要载体,也越来越高频地出现在大家视野中。方案优秀,效果上乘,运行高效,编辑器友好的体积解决方案是任何一款现代游戏引擎中非常重要的组成部分。当然,对于游戏开发者而言,我们时刻面临着"可交互速率运行"的考验。这直接导致了几乎每一个落地的体积渲染或者流体模拟方案都有其必须做出的割舍与牺牲,也都有其擅长应对的情景和有意规避的难题。然而,虽然已经有一些分析"体积渲染"或"流体模拟"的文章,但大多唯此一篇,缺乏针对不同方案的纵向深入与横向对比;或受限于特定引擎平台,缺乏底层通用性理论的系统论述。现实是,截止到SIGGRAPH 2022,我们依旧没有找到一套适应于任意场景需求的体积云雾方案【仅限游戏领域】。而实时背景下将"体积渲染"与"流体模拟"结合起来,依旧是一个非常小众的话题。至于体积的燃烧过程与爆炸模拟仍然是影视"一家独唱"。但无论如何,实时、体积、流体三个词融在一起都是令人无比憧憬的,因为很多时候并不是项目需要推动了技术进步,而是技术进步带来了新的玩法与新的艺术表现形式。

鉴于此,笔者决定维护一个专栏用于系统性的分析当前与潜在的"体积流体"方案,它们中的一些惊艳于SIGGRAPH与GDC,并在游戏开发史上留下了浓墨重彩的一笔,另外一些虽然小众,但切入点与思考方向非常有价值。如果读者之前有接触过这些工作,就会意识到这是一个涉及数据的生成,存储与转换,算法的设计与优化,视觉表达与内容管理,以及引擎和工具链开发的庞大内容,当我们站在产品项目管理周期的视角去考虑,会发现大家最经常讨论的3D噪声纹理与Ray marching其实只是整个系统的一小部分。除了传统的手段,伴随着机器学习MLP对数据、信号的解构与重建的研究,利用神经网络压缩数据,加速访问与碰撞检测的尝试也逐渐受到了工程界与学术界的重视,这似乎为解决一些传统困境提供了可能。除了已被落地证实的稳健方案,这些潜在的研究价值也会被纳入讨论范围。

在流体方案层面,我们可能更着重讨论欧拉视角,或以Stable Fluid为代表的半拉格朗日方法,以及MLS-MPM等混合方法。这全然是因为我们需要面对的是云、雾、烟、火焰这类的介质 ,而非液体。更为复杂的多相流问题,似乎在游戏中应用的可能性不大,但如果有时间,追加这部分的研究也是非常让人兴奋的。一旦我们将视角放开到影视领域,对物理规律的还原将变得更加苛刻,虚拟世界也更加真实!

作者Angelou.lv:技术美术

现在国内某头部游戏厂商做TA,主攻图形渲染与物理模拟。


目录

1|真实云现象的研究

2|《Horizon Zero Dawn》的体积云景实现

3|《西部禁域》中的体积云渲染

4|Unreal中的体积云景实现分析


本篇转载自《游戏中的体积流体技术》的第1节。

鉴于平台编辑限制,以下颜色信息无法体现,欢迎有兴趣的小伙伴致原文阅读。

文中会对一些名词进行颜色标注:绿色是方案中比较重要的专有术语,蓝色是维基百科上可以检索到的术语,橙色表示目录。

注:蓝色文字且加下划线表示加了超链接。

一、云族谱

1.1 云属

按照国际气象组织的分类[1],云一共有10个属:

云的10个属

每属均有自己的简称和观察特征,这10个云属按照高度分布如下:

云层分布(全称)

云层分布(简称)

上图内容大致是云的种类由低到高分别为【低云族】"积云(Cumulus),积雨云(Cumulonimbus),层云(Stratus), 层积云(Stratocumulus)";【中云族】"高积云(Altocumulus),高层云(Altostratus),雨层云(Nimostrartus)";【高云族】"卷云(Cirrus),卷积云(Cirrocumulus),卷层云(Cirrostratus)"。

大多数云都仅存在于它们的层面内,但通常界限比较模糊。比如高层云通常属于中间层,但它的顶部往往可延伸至更高的层面,而雨层云虽然位于中层云最高层但也可延伸至另外两个层面,积云和积雨云通常在低层,但积雨云的垂直范围又很大。

云层的大概分布范围在600~8000米,而渲染上影响云的视觉表现主要有"形状,结构,灰度,透光程度"这四个主要因素。

每个层面的近似高度&每个层面中出现的属

1.2 云种

根据云的形状和其内部结构,大多数的云属可被细分为云种,如毛状云(Ci),钩状云(Ci),密云(Ci)都是卷云,但形状又有不同:

又如堡状云(Ac),絮状云(Ac),层状云(Ac)都属于高积云:

再如扁平云(Cu),中云(Cu),浓云(Cu)都属于积云:

1.3 云类

除了按照形状与内部结构分,也可以按照云的另外两种重要属性------灰度与透光程度去分,被称为不同的云类:

另外除了"形状,结构,灰度,透光程度"这四个主要特征,云还有附加特征与附属性,前者是指附着在云上或者部分主体合并的特征,后者则侧重于伴随云主体出现在附近的小云团,它们被称为附属云。云是在不断变化的,母云会演化出不同的衍生云,随着主体逐渐变化,母云原本的特征可能完全消失不见,此时的云被称为"转化云"。

除了自然演化,人类活动也会影响上空的云变换,比如核电站冷却塔,大坝上空,飞机航线上,这些特殊因素产生的云被别称为"特殊":


二、低云族

2.1 积云(Cu)

积云是距离地表最近的,因此也是密度最大的,按照第一部分云的四个主要特性的维度去分析:积云具有最清晰的轮廓,上部分类似花椰菜或山丘,底部则相对较平,这些云被阳光照射部分多为白色,底部相对较暗,这可以用Beer-Lambert定律解释。典型的形态如下:

图为:浓积云正在蒙特勒后面的瑞士阿尔卑斯山脉和瑞士日内瓦湖沿岸发展

当然这是最典型的,这种厚重的积云往往出现在沿海城市,因为更容易有水蒸气升腾,它们被细分为一个云种------浓积云(Cu con)。对于浓积云来说顶部通常以"塔"的形式垂直发展,塔太高被风吹过时会瓦解,从而形成丰富的衍生云,浓积云会产生诸多形式的降水:降雨,降雪,极端天气下还会产生冰雹。

图为:西班牙巴塞罗那Vallvidrera

但积云不一定会产生降水,在内陆地区,水蒸发量会少很多,这个时候它们的密度相对较低,垂直范围变窄,导致看起来相对扁平,这是积云属的一个特殊云种------淡积云或扁平云:

图为:淡积云

随着含水量逐渐升高,积云变得越来越重,越来越厚。逐步变为中积云(Cu med):中积云也具有一系列清晰的轮廓,云底相对较暗,云层只表现出适当的垂直发展,顶部一般有"小突起" 或者"云芽",也没有降水。

图为:德国爱尔福特地区上空的中积云

但中积云有一定程度会发展为浓积云。另外还有一种积云种叫"碎积云(Cu fra)":云底同样是水平的,变化非常迅速,垂直范围很小,外观扁平:

图为:蒙古赛音山达的碎积云

2.2 积雨云(Cb)

积雨云一个非常典型的特征是:有相当大的垂直范围,呈现高塔或高山状,且其上部至少有一部分通常是光滑平缓的,而在下部通常则较暗且粗糙,整体通常为"砧状",具有明显的纤维状结构。

图为:西班牙昆卡的积雨云

2.3 层云(St)

图:注意左下角山峦间的云

层云似乎没什么明显的视觉特征,形态上相对均匀,颜色为灰色,透过云看太阳时会产生清晰的轮廓,在诸多的层云种里最明显的是"波状层云(St un)":一层层的鳞片状,每层云片具有波浪状结构。

图为:德国巴特克罗伊茨纳赫县的波状层云

2.4 层积云(Sc)

图:貌似有些图文不符

图为:澳大利亚,维多利亚州,布罗德梅多斯

层积云灰色偏白一些,卷状或大型圆形物质以延伸的片状或层状排列。


三、中云族

3.1 高积云(Ac)

高积云一般成絮状,有时呈纤维状,通常带有阴影。上图与下图分别展示了层状,絮状高积云两个云种。

图为:日本,京都,右京区,嵯峨天龍寺造路町

另外一类特殊的高积云种------"卷滚高积云(Ac vol)",这是一种"较长,水平,分离,管状"的云团,因为看起来像绕水平轴缓慢滚动,所以被称为"卷滚高积云"。

还有一类高积云种比较特殊,因为它们形状上呈荚状或杏仁状,细长且有明确的轮廓,结构上像多层云片紧密叠加在一起,层与层之间有明显的阴影,被称为"荚状高积云"。

图为:英国,西约克郡,沃夫河谷山脉背风面上空形成的荚状高积云

堡状高积云是指由共同底部相接的云元素垂直上升的积云状云堡,具备如下特点:

  • 似乎是按照线型排列
  • 让云呈现出锯齿状(城堡城垛)外观
  • 其高度有时候比宽度要大
  • 从侧面看云时尤其明显

图为:大不列颠及北爱尔兰联合王国德文郡埃克塞特的堡状高积云

3.2 高层云(As)

高层云的典型特征是全部或部分覆盖天空,云的形态本身而言一般为片状,结构较为均匀且有非常薄的部分,高层云不会产生光晕。这种云属因为外观与内部结构非常一致,所以没有特殊的云种。

3.3 雨层云(Ns)

颜色上雨层云一般为黑色,偶尔为灰色,云层始终非常厚。


四、高云族

4.1 卷云(Ci)

卷云有非常明显的结构特征------白色细腻的弯曲丝线状并排在一起形成窄带,厚度上非常的轻薄。

图为:大不列颠及北爱尔兰联合王国伯克郡靠近雷丁的Stratfield Mortimer

卷云属有很多的云种,例如毛卷云(Ci fib),钩状卷云(Ci unc),密卷云(Ci spi),堡状卷云(Ci cas),絮状卷云(Ci flo):

图为:澳大利亚,维多利亚,莫迪亚勒克的毛卷云

钩状卷云形状像逗号,最后以钩子或簇绒的形式停留在顶部:

密卷云是块状的,单一块内分布较为密集,面向太阳的方向为灰色,通常在积雨云的上部形成。

图为:泽西岛圣布雷拉德的密卷云

对于密度较大的卷云,从共同云底生成圆形和纤维状的堡状云或云团,有时具有圆孔状外观,或带有小圆塔或齿状物,整体是白色的,没有底部阴影。这种卷云被称为"堡状卷云"。

图为:西班牙马德里

4.2 卷积云(Cc)

卷积云的形状与结构也非常好辨认,它们看起来是一片轻薄,松散的,由无数颗粒或波纹式小型元素组成的集合体。

卷积云也分为很多云种,包括:"成层卷积云(Cc str),荚状卷积云(Cc len),堡状卷积云(Cc cas),絮状卷积云(Cc flo)"。

成层卷积云相对较大的片或层形式的卷积云,有时存在断层。

图为:澳大利亚,维多利亚州,阿斯彭代尔花园的成层卷积云

荚状卷积云形状为荚状或杏仁形的卷积云片,通常较为细长且有清晰的轮廓,大多非常光滑,颜色很白。

图为:西班牙瓦伦西亚塞拉的荚状卷积云

在卷积云里,其中一些元素以小型堡状的形式垂直发展,从共同的水平底部升起,形成堡状卷积云。当从高于地平线30°以上的角度观测时,这些堡状云的表观宽度始终小于1°。堡状云因该高度的不稳定性而发展。

图为:德国巴特克罗伊茨纳赫县

非常小的积云状的云簇,其下部或多或少是不规则的。当从高于地平线30°以上的角度观测时,每个云簇的表观宽度始终小于1°。絮状云因该高度的不稳定性而发展。絮状卷积云有时是由堡状卷积云发展而来:

4.3 卷层云(Cs)

透明、白色的、纤维状(头发状)或光滑外观的云巾,全部或部分覆盖天空,经常产生光晕现象。一般可细分为"毛卷层云(Cs fib),雾状卷层云(Cs neb)"。


五、地形与气候对云的影响分析

地形气候因素影响了云的生成,形态,这些相互关联的机理在构建宏大天气系统,特别是追求物理的天气变换时尤为重要。Andrew Schneider在SIG 2015与2017中给出了他们的解决方案,介绍了地形气候,时间以及剧情表现如何影响云景的生成与调度,我们会在下一节进行介绍。

总结性的规律是,当气流穿过山谷,丘陵或山脊时会受到障碍影响而被迫抬升------"地形抬升",至于抬升的气流是否能形成云还与空气稳定性,水汽含量与温度分布有关,白天温度较高空气也会升腾,如果含水量较高且空气相对稳定,则升腾的水汽会在高空冷凝形成云。因此云的形成受地形抬升与热抬升的共同影响。

常见的地形云的云属是积云[中积云,碎积云,淡积云,特别明显的浓积云一般不好直接通过算法实现],层云和高积云,因此这三类云也是重点模拟的。

Reference:

1\] 国际气象组织对云的分类 : [cloudatlas.wmo.int/zh-hans/pri...](https://link.juejin.cn?target=https%3A%2F%2Fcloudatlas.wmo.int%2Fzh-hans%2Fprinciples-of-cloud-classification-genera.html "https://cloudatlas.wmo.int/zh-hans/principles-of-cloud-classification-genera.html") \[2\] Jack Miller对云和天气现场的延时摄影作品《海风》:[vimeo.com/user4463840...](https://link.juejin.cn?target=https%3A%2F%2Fvimeo.com%2Fuser44638407 "https://vimeo.com/user44638407") *** ** * ** *** 以上就是[《游戏中的体积流体技术》](https://link.juejin.cn?target=https%3A%2F%2Fedu.uwa4d.com%2Fcourse-intro%2F0%2F499 "https://edu.uwa4d.com/course-intro/0/499")的第1节,此篇文章比较适合对体积渲染与流体方案的实现有需要的引擎、TA、对相关内容感兴趣的学生以及其他领域的开发人员与教育工作者。 读完全篇后你会获得: 1、系统的体渲染知识,游戏领域可用的流体动力学实现; 2、PC端与移动端的体积云、雾实现;效果与性能的把控,各类优化手段与移动端平替方案; 3、硬件知识,图形分析工具的使用,引擎渲染管线的定制; 4、学科交叉的机器学习理论知识与在游戏引擎中进行机器学习训练的方法。

相关推荐
五岁小孩7 小时前
实操使用 go pprof 对生产环境进行性能分析(问题定位及代码优化)
性能优化·golang·pprof
五点六六六12 小时前
前端常见的性能指标采集
前端·性能优化·架构
软件测试-阿涛13 小时前
【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
测试工具·jmeter·性能优化·压力测试·grafana·prometheus
海底火旺14 小时前
单页应用路由:从 Hash 到懒加载
前端·react.js·性能优化
鼠鼠我捏,要死了捏16 小时前
深入解析MongoDB分片原理与运维实践指南
mongodb·性能优化·sharding
拾光拾趣录17 小时前
内存泄漏的“隐形杀手”
前端·性能优化
鼠鼠我捏,要死了捏1 天前
基于Redisson实现高并发分布式锁性能优化实践指南
性能优化·分布式锁·redisson
笑衬人心。1 天前
后端项目中大量 SQL 执行的性能优化
sql·spring·性能优化
贵州晓智信息科技1 天前
Unity 性能优化全攻略
unity·性能优化·游戏引擎
UWA2 天前
UWA DAY 2025 游戏开发者大会|全议程
游戏·unity·性能优化·游戏开发·uwa·unreal engine