摘要

游戏中的实时体积云通常以降低质量为代价获得快速性能。最成功的方法仅限于低空蓬松和半透明的层状云。对于地平线零黎明,Guerrilla 需要一种解决方案,该解决方案可以用不断变化的现实结果填充天空,这些结果与高度详细的参考图像非常匹配,这些参考图像代表高海拔卷云cirrus clouds和所有主要的低空云类型,包括厚厚的滚滚积云thick billowy cumulus clouds。这些云需要根据一天中的时间和其他特定于云的照明效果正确照明。此外,我们的目标是 2ms 的 GPU 性能。我们的解决方案是体积云着色器基于噪声纹理进行程序化建模,它可以在不牺牲质量或绘制时间的情况下有逻辑地处理建模、动画和照明等各个方面的解决方案。我们将特别强调针对云形状和云直接形成的能力以及我们对照明模型和优化。

目标游戏特点

![image.png](https://img-blog.csdnimg.cn/img_convert/3cce57483142012e5916c1187b4006af.png#averageHue=#606463&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=454&id=u9cb334b6&margin=[object Object]&name=image.png&originHeight=454&originWidth=917&originalType=binary&ratio=1&rotation=0&showTitle=false&size=607075&status=done&style=none&taskId=ufd6abecf-9b28-4b05-9ef9-d423b48d54d&title=&width=917)

实现目标

![image.png](https://img-blog.csdnimg.cn/img_convert/4f9bab591a3f41dea391650496fd93c8.png#averageHue=#6e7474&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=455&id=ude62ecc7&margin=[object Object]&name=image.png&originHeight=455&originWidth=691&originalType=binary&ratio=1&rotation=0&showTitle=false&size=467404&status=done&style=none&taskId=u8f097ee6-8955-4dfb-a1ad-dd9fb3cb26b&title=&width=691)

早期探索

流体解决方案

![image.png](https://img-blog.csdnimg.cn/img_convert/4abe27b5043def60d9da98771ac2f73e.png#averageHue=#121212&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=605&id=uadadcb6a&margin=[object Object]&name=image.png&originHeight=605&originWidth=1151&originalType=binary&ratio=1&rotation=0&showTitle=false&size=203164&status=done&style=none&taskId=ud1cb3211-cb88-473f-b3ee-51656a8098b&title=&width=1151)
PRO:

  • 效果不错,真实性很强

Con:

  • 艺术家难以控制
  • 需要流体模拟经验

具体应用:

  1. 对云朵体素化后,放入流体解决器生成流体模拟的云

![image.png](https://img-blog.csdnimg.cn/img_convert/ff9370e96bd824cdf590f12aa7b64c65.png#averageHue=#404040&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=247&id=u8417b4f2&margin=[object Object]&name=image.png&originHeight=536&originWidth=782&originalType=binary&ratio=1&rotation=0&showTitle=false&size=88515&status=done&style=none&taskId=ued1483d5-336b-43e0-afbd-77ff7471604&title=&width=360)![image.png](https://img-blog.csdnimg.cn/img_convert/a53c1b2f766284a20365993c61a96448.png#averageHue=#534d4d&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=248&id=u1c454dd8&margin=[object Object]&name=image.png&originHeight=556&originWidth=814&originalType=binary&ratio=1&rotation=0&showTitle=false&size=228668&status=done&style=none&taskId=u594410d4-6262-45e2-8f21-c641fadceed&title=&width=363)

  1. 加入光照模型中进行预计算的第一次和第二次的光散射

![image.png](https://img-blog.csdnimg.cn/img_convert/a2f1e96fec2f25c263b7008f8f27ffa5.png#averageHue=#1e1e1e&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=590&id=u6e5d0612&margin=[object Object]&name=image.png&originHeight=590&originWidth=1148&originalType=binary&ratio=1&rotation=0&showTitle=true&size=178720&status=done&style=none&taskId=uaf7862ac-d6f7-41ad-824f-60dd07b4d3d&title=在houdini上用cpu渲染10s的结果&width=1148 “在houdini上用cpu渲染10s的结果”)

  1. 将云的资产导入游戏中,总共有三种表达方式

云的三种传统表达方式

1.多边形模型
![image.png](https://img-blog.csdnimg.cn/img_convert/1af901d3be424081cf1a5e811baafa70.png#averageHue=#fbfdfb&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=617&id=u6069102c&margin=[object Object]&name=image.png&originHeight=617&originWidth=1071&originalType=binary&ratio=1&rotation=0&showTitle=false&size=224876&status=done&style=none&taskId=ubf053a4f-9a66-4e61-ad40-49662af2133&title=&width=1071)
首先,我们尝试将我们的云视为景观的一部分,从字面上将它们建模为流体模拟中的多边形,并使用球谐函数SH烘焙照明数据。 这仅适用于厚厚的云层,而不适用于 纤细的 的云层…

  1. billboard

![image.png](https://img-blog.csdnimg.cn/img_convert/0d1bf905ea59356116a063612fbf7f1b.png#averageHue=#464646&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=546&id=ubaf8f326&margin=[object Object]&name=image.png&originHeight=546&originWidth=1133&originalType=binary&ratio=1&rotation=0&showTitle=false&size=65701&status=done&style=none&taskId=u51c35518-3450-453f-931b-bbc55c151e9&title=&width=1133)
尽管增强广告牌方法以支持多种方向和一天中不同时间的云朵方案成功了, 但我们发现我们不能轻易地重现云间阴影。 所以…

  1. SkyDome 天空盒

![image.png](https://img-blog.csdnimg.cn/img_convert/fcc694c71e91505fcf6e26770e2a95df.png#averageHue=#333024&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=608&id=u3a8bc57c&margin=[object Object]&name=image.png&originHeight=608&originWidth=1155&originalType=binary&ratio=1&rotation=0&showTitle=false&size=512204&status=done&style=none&taskId=u467a5986-f863-48d3-8fdd-4972b6d982c&title=&width=1155)
我们尝试将我们所有的体素云渲染为一个云集,以产生也可以在深度上融入大气的天穹,这在一定程度上起作用了。但是, 没有一个解决方案使云随着时间的推移而发展。 没有一个好办法让云从头顶掠过。 并且所有方法都存在高内存使用和过度绘制的情况。
所以也许传统的基于资产的方法行不通。

Voxel Clouds ?!?

![image.png](https://img-blog.csdnimg.cn/img_convert/a3bb5d759e2daac301d4ddd61134872f.png#averageHue=#383838&clientId=ub29ac19b-94fe-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=375&id=u32813d8d&margin=[object Object]&name=image.png&originHeight=375&originWidth=847&originalType=binary&ratio=1&rotation=0&showTitle=false&size=55435&status=done&style=none&taskId=u2b0d0d17-5c9b-42e0-9ad7-f8cef63074d&title=&width=847)
尽管体素云有着传统来讲非常昂贵的推理读取开销,复杂的ray march步骤,嵌套的循环渲染。
但是,现实中已经有着成熟的已经验证过的实时体积光渲染技术,以及令人信服的云朵噪音模型
我们能否以某种方式解决体素云的开销问题并从体素云的优势中受益?

  1. 首先我们测试在摄像机前堆叠一堆多边形,并用它们对 3d Perlin 噪声进行采样。 虽然速度极慢,但这是有希望的,但我们想要表示多种云类型,而不仅仅是这些带状云。![image.png](https://img-blog.csdnimg.cn/img_convert/9d44b7f5932ef17eb71690f679c07405.png#averageHue=#92979d&clientId=u6b41cb02-f188-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=590&id=u6a686d85&margin=[object Object]&name=image.png&originHeight=590&originWidth=1104&originalType=binary&ratio=1&rotation=0&showTitle=false&size=264823&status=done&style=none&taskId=u85d41d9b-7ee1-446b-9ce5-4dfc4a9dfa7&title=&width=1104)
  2. 所以我们进入了 Houdini 并从模拟的云形状中生成了一些平铺的 3D 纹理。 使用 Houdini 的 GL 扩展,我们构建了一个原型 GL 着色器来开发云系统和光照模型。

![image.png](https://img-blog.csdnimg.cn/img_convert/eddd0a03c0c6afed02a2579dcba4fc3c.png#averageHue=#626262&clientId=u6b41cb02-f188-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=616&id=uac05b01b&margin=[object Object]&name=image.png&originHeight=616&originWidth=1113&originalType=binary&ratio=1&rotation=0&showTitle=false&size=266028&status=done&style=none&taskId=u0c3345cc-b497-4518-a4ed-84645e43fbf&title=&width=1113)

  1. 最后,通过很多hack,我们非常接近模仿我们的参考。 然而,当我们让云层运动时,一切都崩溃了。 每帧也需要 1 秒的时间来计算。 对于我来自动画特效的来说,这非常令人印象深刻,但对于实时渲染的游戏来说,还远远不够。![image.png](https://img-blog.csdnimg.cn/img_convert/a80ba14949cb67a2ce3c21ddabea8007.png#averageHue=#e3e6e4&clientId=u6b41cb02-f188-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=535&id=u871705d2&margin=[object Object]&name=image.png&originHeight=535&originWidth=1140&originalType=binary&ratio=1&rotation=0&showTitle=false&size=579275&status=done&style=none&taskId=u06b0f825-bb87-4fb3-9ced-52a67555d7d&title=&width=1140)

所以我想,与其明确定义具有预定形状的云,我们可以在具有我们喜欢的特征的较低分辨率下开发一些好的噪声,然后根据一组规则找到一种混合它们的方法。

Volumetric Cloundscapes

![image.png](https://img-blog.csdnimg.cn/img_convert/abb56bd7a180acec584ea5aedca422b9.png#averageHue=#838383&clientId=u6b41cb02-f188-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=627&id=ue138fbe8&margin=[object Object]&name=image.png&originHeight=627&originWidth=1105&originalType=binary&ratio=1&rotation=0&showTitle=false&size=661385&status=done&style=none&taskId=u9bc21fec-1d4b-46f2-84eb-4e3710ef132&title=&width=1105)
最终我们回到地平线游戏的云系统。 为了更好地解释它,我将其分为 4 个部分:建模、照明、渲染和优化。
在我了解我们如何对云图进行建模之前,最好对云是什么以及它们如何演变成不同的形状有一个基本的了解。

Modeling

云的类型

![image.png](https://img-blog.csdnimg.cn/img_convert/055cbfcc91868562f25897ff54bbe06c.png#averageHue=#212121&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=635&id=udd33ac9f&margin=[object Object]&name=image.png&originHeight=635&originWidth=1144&originalType=binary&ratio=1&rotation=0&showTitle=false&size=69272&status=done&style=none&taskId=ue57235e2-3b1d-4365-b072-1f3dce805e9&title=&width=1144)
对云进行分类有助于我们更好地传达我们正在谈论的内容和定义我们将在哪里绘制它们。
基本的云类型如下。

  • 层云stratus包括层云、层积云和积云
  • 高层云和高积云,即平流层上方的那些带状或蓬松的云
  • 卷云使高层大气中的那些大弧形带和小烟团云雾缭绕。
  • 最后是所有云类型的祖父,高高进入大气层的积雨云Cumulonimbus 。

相比之下,珠穆朗玛峰海拔8000米以上。

云建模的影响因素

![image.png](https://img-blog.csdnimg.cn/img_convert/2d68aea2469fc326111afd3c463e6fb8.png#averageHue=#5b574f&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=607&id=u00af89c9&margin=[object Object]&name=image.png&originHeight=607&originWidth=1079&originalType=binary&ratio=1&rotation=0&showTitle=false&size=653511&status=done&style=none&taskId=u5f2f1cfd-72f1-4f61-9a15-d3cf2ae5c96&title=&width=1079)
在对云类型进行研究之后,我们研究了影响云的因素。 我们拥有的最好的资料是两位气象学家 1961 年出版的一本书,其名为“The Clouds”,与 60 年代研究书籍的标题一样富有创意。 它用有用的经验结果和有助于对云系统建模的概念弥补了它缺乏魅力的地方。

  • 密度在较低温度下增加
  • 温度随海拔升高而降低
  • 高密度沉淀为雨或雪
  • 风向随高度变化
  • 它们随着来自地球的热量而升起
  • 密集区域在上升时会形成圆形
  • 光区像雾一样扩散
  • 大气湍流进一步扭曲了云层。

主要影响因子有温度T,海拔H,云密度ρ,风向F等等,这些都是对云建模时有用的抽象。

Overview

![image.png](https://img-blog.csdnimg.cn/img_convert/2a5ecbdabf9c455fd334ae394cfa27e1.png#averageHue=#0a0c0e&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=335&id=u8f960bb3&margin=[object Object]&name=image.png&originHeight=335&originWidth=920&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4682&status=done&style=none&taskId=uf7e758ec-52ad-4ca1-a045-6bce67a0322&title=&width=920)
我们的建模方法使用Ray marching来产生云。我们从相机前进并采样噪声和一组梯度,以使用采样器定义我们的云形状。在Ray marching中,我们使用采样器

  • 建立一个alpha通道…
  • 并计算照明
传统方法

互联网上有很多实时体积云的例子。 通常的方法包括使用称为** fBm(分形布朗运动)的方法**将它们绘制在相机上方的高度区域中。
这是通过分层不同频率的 Perlin 噪声来完成的,直到你得到一些细节。
![image.png](https://img-blog.csdnimg.cn/img_convert/30fc40d78f8e574ed011528eb7d55150.png#averageHue=#4b4b4b&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=245&id=u0b1a942b&margin=[object Object]&name=image.png&originHeight=370&originWidth=767&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56724&status=done&style=none&taskId=u6226f821-2e17-4809-8f46-e19b7d803ff&title=&width=508)
然后,这种噪声通常以某种方式与梯度相结合,以定义云密度随高度的变化。
![](https://img-blog.csdnimg.cn/img_convert/bd57a2590fdf9a50e4b483c865866627.png#averageHue=#212220&crop=0&crop=0&crop=1&crop=1&from=url&id=wKX4Z&margin=[object Object]&originHeight=480&originWidth=948&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
我们能得到一些非常漂亮但非常程序化的云。
![image.png](https://img-blog.csdnimg.cn/img_convert/ac5e637aa28cc7a91c99ecb5ebb83d83.png#averageHue=#a5adb6&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=652&id=u36f44272&margin=[object Object]&name=image.png&originHeight=652&originWidth=1179&originalType=binary&ratio=1&rotation=0&showTitle=false&size=523191&status=done&style=none&taskId=ud74a7902-b9d5-4b9f-a7a5-582f6c684c0&title=&width=1179)![image.png](https://img-blog.csdnimg.cn/img_convert/176b493bba13076ab6eafcbe4784fe43.png#averageHue=#6788b0&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=418&id=u5e20ef1c&margin=[object Object]&name=image.png&originHeight=672&originWidth=1199&originalType=binary&ratio=1&rotation=0&showTitle=false&size=821253&status=done&style=none&taskId=u8cc8a7ab-2b59-4573-b3f2-f2c66026442&title=&width=746)
通过与照片对比,我们能很明显地发现一些问题:

  • 实际上,生成的云没有主要的显示形状或直观的视觉提示,例如照片中纤细的云和圆形的云。
  • 同时, 我们没有感觉到云的形状隐式演变。

这种 fBm 方法有一些漂亮的 whispy 形状,但它缺少那些给人运动感的凸起和波浪 bulges and billows 。 我们需要让我们的着色器超越在 ShaderToy 之类的东西上所能塑造的云。
![image.png](https://img-blog.csdnimg.cn/img_convert/8a88f422287b364c5cb7eb63ac243fa0.png#averageHue=#7c7f7d&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=553&id=u62dc81f5&margin=[object Object]&name=image.png&originHeight=553&originWidth=1106&originalType=binary&ratio=1&rotation=0&showTitle=false&size=744554&status=done&style=none&taskId=u070436ba-3631-4ccf-b8f7-e3dc9a0bf1d&title=&width=1106)
这些有时呈现为花椰菜形状的云很难用单独的 Perlin 噪声实现它,所以我们需要开发自己的分层噪声。

Perlin-Worley 噪声

![image.png](https://img-blog.csdnimg.cn/img_convert/791d7918309d4afe473bc9ab51899b78.png#averageHue=#3c3c3c&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=651&id=u3b92b01d&margin=[object Object]&name=image.png&originHeight=651&originWidth=1209&originalType=binary&ratio=1&rotation=0&showTitle=true&size=226881&status=done&style=none&taskId=u5b683931-a3c9-4b2a-9a73-28eb907926b&title=Perlin-Worley 噪声&width=1209 “Perlin-Worley 噪声”)
![image.png](https://img-blog.csdnimg.cn/img_convert/415489dee75587294031460c75b2f547.png#averageHue=#4d4d4d&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=267&id=u137573af&margin=[object Object]&name=image.png&originHeight=630&originWidth=666&originalType=binary&ratio=1&rotation=0&showTitle=true&size=161468&status=done&style=none&taskId=uf03bf9b3-422d-4358-b1a9-6a0e6907937&title=Worley 噪声&width=282 “Worley 噪声”)![image.png](https://img-blog.csdnimg.cn/img_convert/a78a3d2aafbdbc573c07ec2e32403e38.png#averageHue=#3d3d3d&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=267&id=u9d042d5a&margin=[object Object]&name=image.png&originHeight=645&originWidth=678&originalType=binary&ratio=1&rotation=0&showTitle=true&size=194100&status=done&style=none&taskId=u17df8fca-7870-42a4-a22a-565116bb3c3&title=类似fBM进行波浪化分层&width=281 “类似fBM进行波浪化分层”)![image.png](https://img-blog.csdnimg.cn/img_convert/b5ccfea7b59714819a7f775a565c7bdc.png#averageHue=#595959&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=327&id=uff61d1b2&margin=[object Object]&name=image.png&originHeight=631&originWidth=686&originalType=binary&ratio=1&rotation=0&showTitle=true&size=168082&status=done&style=none&taskId=u3802d49c-f35f-43dd-ab43-6a66fb4d518&title=扩散为Perlin噪声&width=356 “扩散为Perlin噪声”)
Worley 噪声由 Steven Worley 于 1996 年引入,通常用于焦散和水效果。 如果它像您在此处看到的那样反转:

  • 使成为紧凑的波浪形状。
  • 我们像标准的 Perlin fBm 方法一样对Worley 噪声进行分层
  • 然后我们用它作为补偿来扩大 Perlin 噪声。

这使我们能够保持 Perlin 噪声的连通性,但添加一些波涛汹涌的形状。我们将此称为“Perlin-Worley”噪声

噪声纹理存贮方式

在游戏中,将噪声存储为平铺 3d 纹理通常对性能来说是最好的。我们希望将纹理读取保持在最低限度,并保持分辨率尽可能小。在我们的例子中,我们将噪音压缩到:两个 3D 纹理 和 1 个 2d 纹理。

The first 3d Texture![image.png](https://img-blog.csdnimg.cn/img_convert/88db4c139f461d00d68f265e2b5db275.png#averageHue=#373737&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=572&id=u69f12b25&margin=[object Object]&name=image.png&originHeight=572&originWidth=1114&originalType=binary&ratio=1&rotation=0&showTitle=false&size=183552&status=done&style=none&taskId=u3b053be8-2139-47f0-9a9e-a6a94d8b46e&title=&width=1114)

•has 4 channels
•it is 128^3 resolution…
•The first channel is** the Perlin - Worley noise**
•The other 3 are** Worley noise at increasing frequencies**.
Like in the standard approach,** This 3d texture is used to define the base shape for our clouds.**

The Second 3d texture

![image.png](https://img-blog.csdnimg.cn/img_convert/67d4094bf9d8d931587ddee7b002a527.png#averageHue=#2a2a2a&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=582&id=u9a75423f&margin=[object Object]&name=image.png&originHeight=582&originWidth=1105&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49822&status=done&style=none&taskId=ucf184a4c-7903-4da8-9f31-ecd44b36ab5&title=&width=1105)
•has 3 channels…
•it is 32^3 resolution…
•and uses Worley noise at increasing frequencies.
This texture is used to add detail to the base cloud shape defined by the first 3d noise.

The Only 2D texture

![image.png](https://img-blog.csdnimg.cn/img_convert/ae34d9f0bd63698e967b8b7a9588d82d.png#averageHue=#343434&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=512&id=uec900deb&margin=[object Object]&name=image.png&originHeight=512&originWidth=1040&originalType=binary&ratio=1&rotation=0&showTitle=false&size=113102&status=done&style=none&taskId=u2e6b9ab3-00b0-422b-abd3-494c9769193&title=&width=1040)
•has 3 channels…
•it is 128^2 resolution…
•and uses **curl noise 卷曲噪声. **Which is non divergent 非发散的 and is used to fake fluid motion 伪造流体运动.
We use this noise to distort our cloud shapes and add a sense of turbulence.
我们使用这种噪音来扭曲我们的云形状并添加一种湍流感。

高度梯度纹理

![image.png](https://img-blog.csdnimg.cn/img_convert/01e06dc4c66c5c48652978b2449c0888.png#averageHue=#282828&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=566&id=u028c9739&margin=[object Object]&name=image.png&originHeight=566&originWidth=938&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23238&status=done&style=none&taskId=ufe7aa1d3-eae8-4766-a1dd-ca8f8a86b26&title=&width=938)
回想一下,标准解决方案需要一个高度梯度来改变高度上的噪声信号。

  • 我们使用代表主要低海拔地区的** 3 个数学预设**来表达云的类型。
  • 我们在样本位置混合它们当时的云类型
  • 我们还有一个值告诉我们希望在样本位置有多少云覆盖。 这是一个介于 0 和 1 之间的值。

绘制流程

![image.png](https://img-blog.csdnimg.cn/img_convert/a3a2fe9268e58e38af6a26da8779c558.png#averageHue=#c3bfb5&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=616&id=uc40efefa&margin=[object Object]&name=image.png&originHeight=616&originWidth=1122&originalType=binary&ratio=1&rotation=0&showTitle=false&size=473261&status=done&style=none&taskId=u6279e578-35e8-4b74-8ec4-5be24f28b41&title=&width=1122)
我们在屏幕右侧看到的是一个在地平线上方旋转约 30 度的视图。 我们将按照标准方法在相机上方的区域中绘制云。

  • 首先,我们通过对第一个 3dTexture 进行采样并将其乘以高度信号来构建基本的云形状。
  • 下一步是将结果乘以覆盖范围并降低云底部的密度。

![image.png](https://img-blog.csdnimg.cn/img_convert/b69c2c0393e73da9d9c9cc79206bda71.png#averageHue=#7b919c&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u801af1f2&margin=[object Object]&name=image.png&originHeight=240&originWidth=889&originalType=binary&ratio=1&rotation=0&showTitle=false&size=174206&status=done&style=none&taskId=u03e47c3e-f4ff-47ae-825d-5c1a5797de8&title=&width=889)
![image.png](https://img-blog.csdnimg.cn/img_convert/d5ffc0bc7ebe5a544916de5129e40613.png#averageHue=#a0abaa&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=275&id=uda71d4da&margin=[object Object]&name=image.png&originHeight=275&originWidth=907&originalType=binary&ratio=1&rotation=0&showTitle=true&size=249617&status=done&style=none&taskId=uef7ac58d-d185-4247-b456-e114b706eeb&title=不同覆盖范围值对比&width=907 “不同覆盖范围值对比”)
这确保了底部会变得纤细,并以更自然的方式增加云的存在。 请记住,密度会随着高度的增加而增加。 现在我们有了基本的云形状,我们添加细节。
![image.png](https://img-blog.csdnimg.cn/img_convert/640fea53c0cce5a64b8b5a0a72b20722.png#averageHue=#a8a39a&clientId=u6cdb1030-fbe1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=688&id=ub4c296dd&margin=[object Object]&name=image.png&originHeight=688&originWidth=1159&originalType=binary&ratio=1&rotation=0&showTitle=false&size=327181&status=done&style=none&taskId=u13cedbba-1cce-45e9-82d5-ec2a92e8e03&title=&width=1159)
接下来

  • 在云的边缘处,通过减去第二个 3d 纹理来侵蚀基础云的形状。 (Tips:如果你在云层的底部反转 Worley 噪声,你会得到一些漂亮的 whispy 形状。)
  • 我们还通过 2d 卷曲噪声扭曲了第二个噪声纹理,以伪造大气湍流造成的漩涡扭曲,正如您在此处看到的那样……

![image.png](https://img-blog.csdnimg.cn/img_convert/429133844f82ea1da3eea21fe6958c57.png#averageHue=#6f766f&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=679&id=u178ec8ea&margin=[object Object]&name=image.png&originHeight=679&originWidth=1200&originalType=binary&ratio=1&rotation=0&showTitle=true&size=981608&status=done&style=none&taskId=u1b8e752e-f4c4-4ac9-8417-947797569de&title=层云&width=1200 “层云”)
![image.png](https://img-blog.csdnimg.cn/img_convert/1735ef86f1822e728371f36206173513.png#averageHue=#676a60&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=682&id=ub4bcb563&margin=[object Object]&name=image.png&originHeight=682&originWidth=1204&originalType=binary&ratio=1&rotation=0&showTitle=true&size=999525&status=done&style=none&taskId=u5c7ff74d-27dc-4560-9b71-28946d49bc2&title=积云&width=1204 “积云”)
这是游戏中实际渲染的样子。 通过调整覆盖率的值可以使它们更厚,然后在积云到层云的高度梯度之间转换。
现在我们有了不错的静止云,我们需要开始努力使它们成为我们天气系统的一部分。

参数控制

These two controls,** cloud coverage and cloud type** are a FUNCTION of our weather system.
•There is an additional control for Precipitation 雨云的降水 that we use to draw rain clouds.
![image.png](https://img-blog.csdnimg.cn/img_convert/f7f63e3f4940c95d7b2f5c53793c09ff.png#averageHue=#a6aaa2&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=687&id=u6128a1a6&margin=[object Object]&name=image.png&originHeight=687&originWidth=1206&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1050533&status=done&style=none&taskId=u8036e5d7-594b-4b34-9015-1bfe0aa873b&title=&width=1206)
在这张图片中,您可以在左下角看到一张小图。 这代表了云层在我们的世界地图部分上空的天气设置。 您看到的粉白色图案是我们天气系统的输出。 红色是cloud coverage,绿色是Precipitation ,蓝色是** cloud type**。 天气系统通过在游戏过程中进行的天气模拟来调节这些通道。 这里的图像有直观的头顶的积云雨云(白色)和远处的规则积云。 我们可以控制对模拟的偏差值,以使云的模拟在一般意义上具有艺术指导性。
![image.png](https://img-blog.csdnimg.cn/img_convert/8bdbfe8696c2aef1761481f6f8000bec.png#averageHue=#979c95&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=683&id=ue08f1f95&margin=[object Object]&name=image.png&originHeight=683&originWidth=1197&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1444787&status=done&style=none&taskId=uae97dcae-d10b-4e83-8240-7ddf0f4b8e8&title=&width=1197)
默认情况下是积云和层云的组合。 较红的区域具有较少的蓝色信号,使它们成为层云。 可以在图像底部中心的远处看到它们。

降水参数

![image.png](https://img-blog.csdnimg.cn/img_convert/951cd0733e2e99f02d1252674df524f9.png#averageHue=#788384&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=681&id=uf91e4da5&margin=[object Object]&name=image.png&originHeight=681&originWidth=1211&originalType=binary&ratio=1&rotation=0&showTitle=false&size=476468&status=done&style=none&taskId=uefda1a2b-d21e-4907-84b1-7b37b847caf&title=&width=1211)
降水信号将任何天空都转变为70% 的覆盖率的积雨云。
降水控制不仅可以调整云层,还可以产生降雨效果。 在上图中,我将降水的值逐渐增加到 100%
![image.png](https://img-blog.csdnimg.cn/img_convert/a5340f1c6e9d9c5fdce93e1a4f2aa4f7.png#averageHue=#525f62&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=679&id=u2b2f5a16&margin=[object Object]&name=image.png&originHeight=679&originWidth=1181&originalType=binary&ratio=1&rotation=0&showTitle=false&size=797331&status=done&style=none&taskId=u0c3b552f-eabf-415b-98a4-22c460ab40f&title=&width=1181)
如果我们增加风速并确保有可能下雨,我们就能实现让暴风云滚滚而来,并开始向我们下雨的效果。

渲染距离

![image.png](https://img-blog.csdnimg.cn/img_convert/d5ceb4c62d84b61062b7cb1db3170fb1.png#averageHue=#18191a&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=643&id=ucad7c8ba&margin=[object Object]&name=image.png&originHeight=643&originWidth=1109&originalType=binary&ratio=1&rotation=0&showTitle=false&size=141874&status=done&style=none&taskId=u78c099c9-ee8d-49e9-87f7-b8dbc01f61d&title=&width=1109)

  • 我们还使用我们的天气系统来确保地平线上的云总是有趣的并且在山上戳。
  • 我们在玩家周围 35,000 米半径范围内绘制云景。
  • 从 15,000 米的距离开始 我们开始以大约 50% 的覆盖率过渡到积云。

Conclusion

![image.png](https://img-blog.csdnimg.cn/img_convert/40cea49f3ce5f66aebc42bad105316fc.png#averageHue=#5f645d&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=667&id=uadc33721&margin=[object Object]&name=image.png&originHeight=667&originWidth=1144&originalType=binary&ratio=1&rotation=0&showTitle=false&size=883751&status=done&style=none&taskId=u184a397c-931c-4520-8952-117e4caaa11&title=&width=1144)
所以总结一下我们的建模方法……

  • 我们遵循标准的 ray-march/ 采样器框架
  • 但是我们用两个层次的细节构建云
    • 低频云底形状
    • 高频细节和失真
  • 我们的噪音是定制的,由 Perlin、Worley 和 Curl 噪音制成
  • 我们为每种云类型使用一组预设来控制高度和云覆盖的密度
  • 由我们的天气模拟或用于过场动画的自定义纹理驱动
  • 并且它在给定的风向中都是动态的。

Lighting

云照明是计算机图形学中一个well-studied的研究领域。 最好的结果往往来自大量的样本。 在游戏中,当您询问照明云的预算是多少时,您很可能会被告知“零”。首先, 我们决定检查当前的近似技术来重现对我们来说最重要的 3 种照明效果。

Lighting Goals

![image.png](https://img-blog.csdnimg.cn/img_convert/1cab182ea1af0ef1622f6076b6b28395.png#averageHue=#757575&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=666&id=u0a94781e&margin=[object Object]&name=image.png&originHeight=666&originWidth=1203&originalType=binary&ratio=1&rotation=0&showTitle=false&size=589811&status=done&style=none&taskId=uc44014f5-ecd4-483b-ac1d-2516c8b430e&title=&width=1203)

  • 云的定向散射或发光性质
  • 当你透过云层看向太阳时的银色衬里
  • 当你远离太阳时,云上可见的黑暗边缘。

前两个有标准解决方案,但第三个是我们必须自己解决的问题。

光在云中的传播过程

![image.png](https://img-blog.csdnimg.cn/img_convert/3277290159d4f6e7a1f1de4bd5b54d70.png#averageHue=#121212&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=681&id=u52248e4c&margin=[object Object]&name=image.png&originHeight=681&originWidth=1189&originalType=binary&ratio=1&rotation=0&showTitle=false&size=97061&status=done&style=none&taskId=u12e9f44f-4577-49bf-aaf1-4565efb0d9e&title=&width=1189)
当光进入云的时候,大多数光线在到达我们的眼睛之前都会花时间从云层内的水滴和冰中折射出来。
当光线最终离开云层时,它可能已经被散射出去了……被云层吸收或与其他光线结合,形成所谓的内散射……
在电影 vfx 特效中,我们可以花时间收集光线并准确地再现它,但在游戏中我们必须使用近似值。 这三种行为可以被认为是概率化的,并且有一个近似结果的标准方法。

Beer’s Law

![image.png](https://img-blog.csdnimg.cn/img_convert/a59200446ccc7e68114aca18c5030bfe.png#averageHue=#080808&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=674&id=u536fe341&margin=[object Object]&name=image.png&originHeight=674&originWidth=1186&originalType=binary&ratio=1&rotation=0&showTitle=false&size=64656&status=done&style=none&taskId=u9a0edceb-a6a6-41b2-a290-12730d9fcf5&title=&width=1186)
比尔定律指出,我们可以根据它穿过的介质的光学厚度来确定到达某个点的光量。 根据比尔定律,我们有一个基本的方法来描述云中给定点的光量。
如果我们用能量代替透射率,用云中的深度代替厚度,然后将其绘制出来,您可以看到能量随深度呈指数下降。 这构成了我们照明模型的基础。

光照目标之一:云中定向散射之云的“银边”

![image.png](https://img-blog.csdnimg.cn/img_convert/fcd105b1d9d02fc8a38232782f93064f.png#averageHue=#0b0b0b&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=632&id=u025a1a9d&margin=[object Object]&name=image.png&originHeight=632&originWidth=1168&originalType=binary&ratio=1&rotation=0&showTitle=false&size=71660&status=done&style=none&taskId=u0179d4e5-fbca-4633-b7dc-c9643619dda&title=&width=1168)
这是云中光线的另一个部分对某一点的光照的贡献,它就是光在云中向前或向后散射的概率不同造成的影响。 在云中,光向前散射的概率更高。 这称为各向异性散射。
1941 年,Henyey-Greenstein 模型被开发用于帮助天文学家进行宇宙尺度的光计算,但今天它被用于可靠地再现云照明中的各向异性。
![image.png](https://img-blog.csdnimg.cn/img_convert/663a40888fba1865df7e1ce061fa4ef8.png#averageHue=#1d1d1d&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=542&id=u040ebf0e&margin=[object Object]&name=image.png&originHeight=542&originWidth=1057&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24769&status=done&style=none&taskId=u3dfac9f3-6851-43ff-a213-30bc55be167&title=&width=1057)
每次我们对光能进行采样时,我们都会将其乘以 Henyey-Greenstein 相位函数
![image.png](https://img-blog.csdnimg.cn/img_convert/aed6c8d6577b2617bd6cd55d8d01d297.png#averageHue=#dac4a0&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=421&id=u9e59f689&margin=[object Object]&name=image.png&originHeight=421&originWidth=1213&originalType=binary&ratio=1&rotation=0&showTitle=true&size=387458&status=done&style=none&taskId=u51201f7f-53ee-4be6-a662-4ec37c85723&title=对比图&width=1213 “对比图”)
在这里你可以看到结果。 左边是我们照明模型的只用比尔定律部分。 在右侧,我们应用了 Henyey-Greenstein 相位函数。 请注意,右侧太阳周围的云更亮。

光照目标之二三:云的黑色波浪边缘

![image.png](https://img-blog.csdnimg.cn/img_convert/eb7b8978a1a9dff67f6ec56db97ee228.png#averageHue=#141414&clientId=ue4da00e0-d2f8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=416&id=u84f685f3&margin=[object Object]&name=image.png&originHeight=416&originWidth=758&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28954&status=done&style=none&taskId=u3dc216f5-cf4a-49bc-a08b-264d01aff84&title=&width=758)
回想一下光线穿过云层的随机走动。

Powder Effect

如果我们将云内部的一个点与表面附近的一个点进行比较,那么云内部的点会接收到更多的散射光。从这个角度来看, 云材质也可以理解为一种光的收集器。 你在云层的表面越深,从附近区域聚集的光的潜力就越大,直到光开始衰减。
![image.png](https://img-blog.csdnimg.cn/img_convert/8259c78f2925d93f30189fc6714cf720.png#averageHue=#4e4e4c&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=495&id=uc2f80b84&margin=[object Object]&name=image.png&originHeight=619&originWidth=1307&originalType=binary&ratio=1&rotation=0&showTitle=false&size=322983&status=done&style=none&taskId=ub88d2358-0ae0-4272-b7b4-096a6f3d15a&title=&width=1045.6)
这在云上的圆形结构中非常明显,以至于云间的裂缝看起来比凸起和边缘更亮,因为它们接收到散射光的小幅提升。这种现象和糖粉在光照下出现的影响相似,在此被称为糖粉现象。
通常在电影中,我们会采取许多样本来收集一个点的贡献光并使用更昂贵的相位函数。 你可以用蛮力得到这个结果。 如果你昨天参加了 Magnus Wrenninge 的多次散射演讲,那么有一个很好的例子来说明如何做到这一点。 但在游戏中,我们必须找到一种方法来近似这一点。

Beer’s-Powder Law

![image.png](https://img-blog.csdnimg.cn/img_convert/67192722b8618d4ed6381a68a6c3ba5f.png#averageHue=#070404&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=661&id=uc29deab6&margin=[object Object]&name=image.png&originHeight=826&originWidth=1490&originalType=binary&ratio=1&rotation=0&showTitle=false&size=95796&status=done&style=none&taskId=u70148e13-4a1d-4b9f-8598-0f6ce520261&title=&width=1192)
随着深入云层,光的散射潜力会增加,更多的散射会到达我们的眼睛。
如果将这两个函数结合(相乘)起来,您会得到描述这种和传统方法一样的效果,在距离表面一小段距离的点光照量最大。
![image.png](https://img-blog.csdnimg.cn/img_convert/d8a0f0539401b10efa722f8da72e2d80.png#averageHue=#1f1f1f&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=668&id=u7d406eff&margin=[object Object]&name=image.png&originHeight=835&originWidth=1471&originalType=binary&ratio=1&rotation=0&showTitle=true&size=206154&status=done&style=none&taskId=u634850ae-d223-4a18-b135-d641abe71a3&title=不同定律应用的对比&width=1176.8 “不同定律应用的对比”)

  • 比尔定律让光线在云朵内部衰减;
  • Powder 糖粉效应让云朵表面出现亮暗的裂痕
  • 两者相乘结合后的结果是对真实情况的近似拟合,能让游戏的实机渲染更加真实。
Powder effect 的视线依赖性

![image.png](https://img-blog.csdnimg.cn/img_convert/8ffc53ea742c5454e0bb42169baf1950.png#averageHue=#141414&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=569&id=u8fccecb4&margin=[object Object]&name=image.png&originHeight=711&originWidth=1445&originalType=binary&ratio=1&rotation=0&showTitle=true&size=65449&status=done&style=none&taskId=ua480e0b5-71bc-4c60-be82-47b474d60eb&title=在面对太阳光时,我们几乎看不到这个现象,而在顺应太阳光的方向看的时候我们才能观察到糖粉现象。&width=1156 “在面对太阳光时,我们几乎看不到这个现象,而在顺应太阳光的方向看的时候我们才能观察到糖粉现象。”)
但我们必须记住,这是一个视线依赖的效应。 我们只在我们的视线向量接近光向量的地方才能看到这个现象,所以powder函数也应该考虑这个梯度。

积雨云的光照模型

![image.png](https://img-blog.csdnimg.cn/img_convert/ce7135da5201d97472895798b6ca08f8.png#averageHue=#95a4ad&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=200&id=uaa256f9c&margin=[object Object]&name=image.png&originHeight=840&originWidth=1544&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1793070&status=done&style=none&taskId=ub2c324d2-dd43-4054-a8e1-b0de0a4f082&title=&width=368)![image.png](https://img-blog.csdnimg.cn/img_convert/fac35630759d39228ea40a9f6e84c53d.png#averageHue=#8094a2&clientId=u88829450-77dd-4&crop=0&crop=0.0381&crop=1&crop=1&from=paste&height=214&id=u56130593&margin=[object Object]&name=image.png&originHeight=907&originWidth=1584&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1914901&status=done&style=none&taskId=ucad24ae8-717a-417f-9271-d6920156a51&title=&width=373)
我们照明模型的最后一部分是我们通过人为地使积雨云变暗,增加它们存在的地方的光吸收。

Conclusion

![image.png](https://img-blog.csdnimg.cn/img_convert/aaa0a9e98e3026542f838759c03b3fb7.png#averageHue=#222222&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=674&id=ucfe8da97&margin=[object Object]&name=image.png&originHeight=843&originWidth=1595&originalType=binary&ratio=1&rotation=0&showTitle=false&size=95265&status=done&style=none&taskId=ubda288c2-4f2a-47d2-b7de-1ab84bbbe61&title=&width=1276)
Beer’s Law e^-d
Henyen-Greenstein HG
•our powder sugar effect P
•And Absorption increasing for rain clouds e^-d*r

Rendering

我已经概述了我们的采样器如何用于模拟云以及我们的照明算法如何模拟与它们相关的照明效果。 现在我将描述我们如何采集样本来构建图像 ,以及我们如何将云融入大气层和一天中的时间周期。
![image.png](https://img-blog.csdnimg.cn/img_convert/d32d0b0cfbe556295d0992d5f04e601a.png#averageHue=#232323&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=305&id=u306fb13f&margin=[object Object]&name=image.png&originHeight=557&originWidth=621&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19771&status=done&style=none&taskId=u9b658599-165a-4022-a7de-641e13bff01&title=&width=339.8000183105469)
使用ray marching进行渲染流程的第一部分是决定从哪里开始渲染。 在通常情况下,地平线位于在地球上,大多数人都知道地球是圆的,构成我们大气层的气体环绕着地球,云层存在于大气层的不同层中。
![image.png](https://img-blog.csdnimg.cn/img_convert/5cb4eb4bb67db35a13edc66848460332.png#averageHue=#4c4d49&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=579&id=ubbd97557&margin=[object Object]&name=image.png&originHeight=724&originWidth=1488&originalType=binary&ratio=1&rotation=0&showTitle=false&size=806667&status=done&style=none&taskId=u46d0ced1-c090-4a5f-ad9a-f0170408073&title=&width=1190.4)
当在海洋等“平坦”表面上时,你可以清楚地看到地球的曲率如何导致云层下降到地平线上。
![image.png](https://img-blog.csdnimg.cn/img_convert/8f2bc72cf2e5c759b5928926a326c4fd.png#averageHue=#201b12&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=670&id=ued20abb6&margin=[object Object]&name=image.png&originHeight=838&originWidth=1498&originalType=binary&ratio=1&rotation=0&showTitle=false&size=72594&status=done&style=none&taskId=u7522b7dc-8021-4b43-9db5-a08723d1723&title=&width=1198.4)
出于游戏制作的目的,我们在这个球形大气中将云分为两种类型。

  • 1500 至 4000 米之间的低空体积层级云……
  • 以及4000米以上的高海拔的二维高空云和卷云。

Ray Marching

上层云不是很厚,所以这是一个很好的区域,可以通过使它们滚动纹理而不是ray marching中使用多个采样器,来减少着色器的开销。
![image.png](https://img-blog.csdnimg.cn/img_convert/e8a4a2a24b3baee85dca937c072ab334.png#averageHue=#1d1d1d&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=682&id=ud28a294b&margin=[object Object]&name=image.png&originHeight=852&originWidth=1504&originalType=binary&ratio=1&rotation=0&showTitle=false&size=91025&status=done&style=none&taskId=u8385a2fb-8bdd-4d8a-98a3-f58e6df819b&title=&width=1203.2)
通过Ray Marching穿过球形大气,我们可以确保云正确地下降到地平线上。这也意味着我们可以通过缩小大气层的半径来强制场景的规模。

IsoSurface Accelerator 等平面加速结构

![image.png](https://img-blog.csdnimg.cn/img_convert/8482ad39c3a9f20face61bcc0f338e1a.png#averageHue=#2a2e31&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=666&id=ua8525cb5&margin=[object Object]&name=image.png&originHeight=833&originWidth=1580&originalType=binary&ratio=1&rotation=0&showTitle=false&size=102341&status=done&style=none&taskId=u23ed7f1f-ee64-4b00-932d-d4f97f82048&title=&width=1264)
在我们的情况下,我们不想做任何我们不需要的工作或任何昂贵的工作。 因此,我们不是对沿射线的每个点进行采样,而是使用我们的采样器两中级别的细节作为一种更便宜的工作方式,直到我们真正碰到云为止。
回想一下:

  • 一级采样器的细节噪声很低,可以形成基本的云形状
  • 二级采样器采样高细节噪点,增加了我们需要的真实细节,高细节噪声常常作为基础云形状边缘的侵蚀而应用。

这意味着我们只需要执行高细节噪声及其所有相关指令,其中低细节样本返回非零结果。
这会产生一个等值面,该等值面围绕着云可能成为的区域。(类似SDF有向距离场的思想)
![image.png](https://img-blog.csdnimg.cn/img_convert/ed106e5857e915dcce842ad5f1ea5579.png#averageHue=#2a2e32&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=663&id=u218a7fa7&margin=[object Object]&name=image.png&originHeight=829&originWidth=1446&originalType=binary&ratio=1&rotation=0&showTitle=false&size=81984&status=done&style=none&taskId=uda2ca468-1fcf-408c-815e-ca18a03b17b&title=&width=1156.8)
因此,当我们通过大气层采集样本时,我们会以更大的步长进行这些更便宜的样本,直到我们到达云等值表面。 然后我们切换到具有高细节噪声及其所有相关指令进行完整详细的采样。 为了确保我们不会错过任何高分辨率样本,我们总是在切换到高分辨率样本之前后退一步。
![image.png](https://img-blog.csdnimg.cn/img_convert/012c792c67414d0b442c43f51994d09a.png#averageHue=#2b2f33&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=659&id=ube974f6b&margin=[object Object]&name=image.png&originHeight=824&originWidth=1526&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82590&status=done&style=none&taskId=u06160f06-a555-4ed0-b564-31043d018c0&title=&width=1220.8)
一旦图像的 alpha 达到 1,我们就不需要继续采样,所以我们提前停止ray marching。
如果我们没有达到一个的 alpha,我们还有另一个优化。
![image.png](https://img-blog.csdnimg.cn/img_convert/d389809d372efd30a5c1fa55ec8136bc.png#averageHue=#2a2e32&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=629&id=ud3a92f1b&margin=[object Object]&name=image.png&originHeight=786&originWidth=1499&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54204&status=done&style=none&taskId=u23339ab7-4eb0-42a2-97cf-d066e2c0dec&title=&width=1199.2)
在连续几次返回零密度的样本之后,我们切换回廉价行进行为,直到我们再次击中某物或到达云层的顶部。

Ray marching 采样优化

![image.png](https://img-blog.csdnimg.cn/img_convert/e7ab355a033f4342c90fba5b34eaea72.png#averageHue=#252a2f&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=588&id=u9bfaddd4&margin=[object Object]&name=image.png&originHeight=735&originWidth=1526&originalType=binary&ratio=1&rotation=0&showTitle=false&size=40979&status=done&style=none&taskId=u82bc837c-be15-41e4-94ed-d2817bd287b&title=&width=1220.8)
由于随着我们向地平线看的视线越接近,ray marchin的射线长度会随之增加,我们从初始 64 个采样点开始,到水平线上可能的 128个采样点结束。 尽管可能因为优化而提前退出ray marching, 我们真的希望他们这样做。
这就是我们如何采集样本来构建图像的 Alpha 通道。 但是,要计算光强度,我们需要采集更多样本。

传统 ray marching 光照计算

![image.png](https://img-blog.csdnimg.cn/img_convert/ae2b47a8918003abda6aaecbd0f5ec82.png#averageHue=#262a2e&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=666&id=ude458903&margin=[object Object]&name=image.png&originHeight=832&originWidth=1566&originalType=binary&ratio=1&rotation=0&showTitle=false&size=112364&status=done&style=none&taskId=u282082ff-b368-45ea-92a5-d9189069e3c&title=&width=1252.8)
通常你在这样的Ray marching中所做的是:
向光源采样,将总和代入光照方程,然后使用 alpha 通道衰减该值,直到因为 alpha 已达到 1而提早退出ray marching。

优化的 ray marching 光照计算

![image.png](https://img-blog.csdnimg.cn/img_convert/83bf07bf0849926be427353eb20bd352.png#averageHue=#272b2f&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=670&id=u435d16c7&margin=[object Object]&name=image.png&originHeight=838&originWidth=1591&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82666&status=done&style=none&taskId=u9edfb836-5409-4b99-a804-2dcd9888ad1&title=&width=1272.8)
在我们的方法中,我们以锥形朝向太阳采样 6 次。 这种平滑是我们使用 6 个样本得到的条带,并用相邻的密度值对我们的光照函数进行加权,从而创造出很好的环境效果。 最后一个样本放置在远离其他样本的位置,以捕捉远处云层投射的阴影。
![image.png](https://img-blog.csdnimg.cn/img_convert/0ba98b41b5193ad1fa7aab8e67767247.png#averageHue=#879daa&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=671&id=uc255f5ef&margin=[object Object]&name=image.png&originHeight=839&originWidth=1566&originalType=binary&ratio=1&rotation=0&showTitle=true&size=1903712&status=done&style=none&taskId=ue0cd8938-6522-4419-a1f9-a3ae57bbfe0&title=最终效果图&width=1252.8 “最终效果图”)

  • 使用我们的 5 个用于照明的锥形采样点。
  • 以及长距离锥体采样点。

为了提高这些光照样本的性能,一旦图像的 alpha 达到 0.3,我们就切换到对廉价版本的着色器进行采样。 这使着色器快了 2 倍
![image.png](https://img-blog.csdnimg.cn/img_convert/91f444a740f5a0688688dea0d7f948f7.png#averageHue=#393939&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=60&id=u52b462b9&margin=[object Object]&name=image.png&originHeight=126&originWidth=837&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9338&status=done&style=none&taskId=uf9d47a87-a050-4626-aa85-96a7256c9e7&title=&width=400.60003662109375)
照明采样点替换了我们照明模型的比尔定律部分中的小写 d 或深度。 然后,该能量值会因云中样本的深度而衰减,以根据标准volumetric ray-marching 的方法生成图像。
![image.png](https://img-blog.csdnimg.cn/img_convert/e7a3a77384b76abe4793f8cd0bbff7ab.png#averageHue=#1f2429&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=656&id=ub4cda2b8&margin=[object Object]&name=image.png&originHeight=820&originWidth=1569&originalType=binary&ratio=1&rotation=0&showTitle=false&size=69878&status=done&style=none&taskId=uf34d0a0b-7fe4-431f-b53d-a6fb7f7c348&title=&width=1255.2)
最后一步是采样高海拔2D高层云的纹理
![image.png](https://img-blog.csdnimg.cn/img_convert/713a336fd18f155de13d5c951cbf14f9.png#averageHue=#666666&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=419&id=u84c3c4b1&margin=[object Object]&name=image.png&originHeight=524&originWidth=1536&originalType=binary&ratio=1&rotation=0&showTitle=false&size=567431&status=done&style=none&taskId=u2ec79f8a-b25d-4a31-a4eb-fc3d10747c0&title=&width=1228.8)
这些是各种类型的卷云和高层云的集合,它们在体积云上方以不同的速度和方向平铺和滚动。

Cloud Color

![image.png](https://img-blog.csdnimg.cn/img_convert/0865563f62383b39b6efb94b4749a023.png#averageHue=#a58a75&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=680&id=u7d1acb30&margin=[object Object]&name=image.png&originHeight=850&originWidth=1604&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1890847&status=done&style=none&taskId=ub5560707-3dc7-486c-b878-ce3184efe52&title=&width=1283.2)
实际上,不同频率的光线在云中混合,产生非常漂亮的色彩效果。 由于我们生活在一个近似的世界中,我们不得不将云颜色建立在一些逻辑假设之上。
我们根据以下模型假设为云着色:

  • 天空的环境光贡献随高度增加
  • 直接照明将以太阳颜色为主
  • 大气层会随之深度增加而遮挡云层。

我们将环境光照和直接光照分量相加,并根据深度通道衰减大气颜色。
![image.png](https://img-blog.csdnimg.cn/img_convert/05c6aa7fd1b99a08b987c4e88a060f8f.png#averageHue=#7e817b&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=711&id=u3a266c14&margin=[object Object]&name=image.png&originHeight=889&originWidth=1607&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1312862&status=done&style=none&taskId=ua6255988-f447-4502-91b3-8f4ea3dfdec&title=&width=1285.6)
现在,可以在游戏中更改一天中的时间,灯光和颜色会自动更新。 这意味着无需预烘焙,并且我们对整个天空的独特内存使用仅限于 2 个 3d 纹理和 1 个 2d 纹理的成本,而不是几十个广告牌或天穹。

Conclusion

![image.png](https://img-blog.csdnimg.cn/img_convert/46c317184daa7b90f11c690afba0a076.png#averageHue=#6a6d65&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=705&id=u73c1cb41&margin=[object Object]&name=image.png&originHeight=881&originWidth=1459&originalType=binary&ratio=1&rotation=0&showTitle=false&size=2003211&status=done&style=none&taskId=u2cdaa4e1-0b23-46eb-8b6a-6008fea9c4e&title=&width=1167.2)

Optimization (简略)

到目前为止,我所描述的方法大约需要 20 毫秒。(笑)
这意味着它很漂亮,但是速度还不够快,无法包含在我们的游戏中。 他的共同开发者和导师内森·沃斯 (Nathan Vos) 的想法是……
![image.png](https://img-blog.csdnimg.cn/img_convert/c66a5e619d10c8103b927dd8466a65e1.png#averageHue=#c8cbc6&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=638&id=u8b549998&margin=[object Object]&name=image.png&originHeight=797&originWidth=1513&originalType=binary&ratio=1&rotation=0&showTitle=false&size=278271&status=done&style=none&taskId=ucf5b7ddf-23d7-4b56-a2be-f10bb517e53&title=&width=1210.4)

  • 每一帧我们都可以使用四分之一分辨率缓冲区来更新最终图像中每个 4x4 像素块的 16 个像素中的 1 个。
  • 我们重新投影上一帧以确保我们有一些持久性。
  • 在我们无法重新投影的地方,比如屏幕的边缘,我们用其中一个低分辨率缓冲区的结果替换。

当我们以半分辨率渲染并使用过滤器对其进行放大时,Nathan 的想法使着色器的速度提高了 10 倍或更多。
这几乎是我们能够将其放入游戏中的全部原因。 因此,我们的目标性能约为 2 毫秒,其中大部分来自指令数量。
![image.png](https://img-blog.csdnimg.cn/img_convert/702252c3cbe2291f37e0fb346efb9a60.png#averageHue=#959fa2&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=698&id=u548b47a2&margin=[object Object]&name=image.png&originHeight=872&originWidth=1413&originalType=binary&ratio=1&rotation=0&showTitle=false&size=2013936&status=done&style=none&taskId=u26d76036-2abb-45dd-af2c-34b93e3beba&title=&width=1130.4)
在审查中,我们认为
我们已经基本实现了最初的目标。 这仍然是一项正在进行的工作,因为制作周期还有时间,所以我们希望能进一步提高性能和直接能力。 我们还在研究大气模型和天气系统,未来我们将在我们的网站和未来的会议上分享更多关于这项工作的信息。

  • 所有这些都是在PlayStation 4上捕获的
  • 这个解决方案是用 PSSL 和 C++ 编写的

Reference

![image.png](https://img-blog.csdnimg.cn/img_convert/f6507ff56c89308031da340c4c6b3fbe.png#averageHue=#464646&clientId=u88829450-77dd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=665&id=u0e42d73a&margin=[object Object]&name=image.png&originHeight=831&originWidth=1397&originalType=binary&ratio=1&rotation=0&showTitle=false&size=590380&status=done&style=none&taskId=udd50125d-3623-4774-92b6-171aa685c39&title=&width=1117.6)

1. THE REAL-TIME VOLUMETRIC CLOUDSCAPES OF HORIZON ZERO DAWN相关推荐

  1. Volumetric Cloudscapes(一):理论

    billboard云没办法实现云间的阴影,所以要做一块 voxel clouds voxel clouds有一些缺点会很耗 • 大量texture读取 • Ray marches • 嵌套循环 塑形部 ...

  2. 阅读笔记 - Horizon Zero Dawn 广袤世界中的玩家漫游

    最开始我是忽略了这篇演讲的,因为Player Traversal是啥并没看懂- -b 后来看到 @顾露 大神在技术选荐中推荐了它,才拖下来看了看. 没想到这篇讲角色Locomotion的演讲中信息量意 ...

  3. 翻译:Player Traversal Mechanics in the Vast World of ‘Horizon: Zero Dawn‘

    介绍 GDC原文链接:GDC Vault - Player Traversal Mechanics in the Vast World of 'Horizon: Zero Dawn' During t ...

  4. GPU-BASED PROCEDURAL PLACEMENT IN HORIZON ZERO DAWN

    Horizeon 基于GPU程序化场景 原因: 1.快速迭代 2.种类多 3.稳定 4.艺术家控制:数据驱动,位置,局部控制 实时程序化编辑 1.传统的是CPU计算 2.转成GPU处理 3.实时编辑 ...

  5. Global Illumination_Real-Time Volumetric Cloud(实时体积云)

    实时体积云渲染可以营造出很棒的天空效果,今天我们就来看一下如何高效的生成动态体积云,至于原理,可以直接看一下地平线中体积云的技术介绍THE REAL-TIME VOLUMETRIC CLOUDSCAP ...

  6. 【GPU精粹与Shader编程】(一) 全系列核心知识点总览

    系列文章前言 <GPU Gems>1~3 .<GPU Pro>1~7 以及<GEM Zen>组成的GPU精粹系列书籍,是游戏开发.计算机图形学和渲染领域的业界大牛们 ...

  7. 【GPU精粹与Shader编程】(七) 一篇文章读完《GPU Gems 3》

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/44671434 本文是[GPU精 ...

  8. 【GPU精粹与Shader编程】 七 一篇文章读完 GPU Gems 3

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/44671434 本文是[GPU精 ...

  9. 【GPU精粹与Shader编程】(一) 开篇 全系列11本书核心知识点总览

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处   文章链接: https://zhuanlan.zhihu.com/p/34917895 系列文章前言 <GPU Gems>1 ...

最新文章

  1. 如何利用单片机IO口产生两倍的电源电压
  2. hdu4864 贪心
  3. win服务器系统程序原因分析
  4. 【Python实现网络爬虫】Scrapy爬取网易新闻(仅供学习交流使用!)
  5. Boost:人口 bimap的测试程序
  6. 算法 深度优先,广度优先
  7. linux uboot启动流程分析,uboot启动流程分析
  8. linux下exe软件反编译工具下载,ilspy.exe
  9. 流编辑器 SED 十分钟入门全教程
  10. PBJ | 华南农大联合中科院东北地理所发表植物功能基因与根际微生物互作综述...
  11. 数智学习 | 一文读懂数据安全分类分级
  12. 前端遇到GET https://XXXX net::ERR_HTTP2_PROTOCOL_ERROR 200问题的解决办法
  13. 计算机 取得高级权限,win10获取system权限,win7获取最高权限
  14. 4个很 丝滑 的 Veu 路由过渡动效
  15. 大数据分析平台洱源县_洱源县专项债可行性研究报告
  16. 如何编制试算平衡表_利用Excel制作总账表试算平衡表
  17. 职场小人拉帮结派被孤立要如何处理
  18. PyTorch强化:01.PyTorch 数据加载和处理
  19. Cisco ××× Client for linux 参考手册
  20. 成功解决tensorflow.python.framework.errors_impl.InvalidArgumentError: slice index 1 of dimension 0 out o

热门文章

  1. 软件工程与实践(第3版)课后习题(二)
  2. 计算机科学版面费,《计算机科学》版面费
  3. 记录一下 yum install *** 报错问题:failure: repodata/repomd.xml from tvinternal_dev: [Errno 256] No more mirr
  4. 高端服务器系统,浪潮高端服务器分析
  5. OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)
  6. GBase 8c V5 主备式部署实操
  7. 机器学习经典算法---EM算法(一文秒懂极大释然估计和EM算法)
  8. 计算机视觉英语论文,计算机视觉导论论文中英双语版(10页)-原创力文档
  9. IPv6发展综述及部署预测与分析
  10. 深入浅出-网络七层模型以及libcurl的使用博客地址