Volumetric Cloudscapes(一):理论

Volumetric Cloudscapes(一):理论_第1张图片
billboard云没办法实现云间的阴影,所以要做一块 voxel clouds

Volumetric Cloudscapes(一):理论_第2张图片

voxel clouds有一些缺点会很耗
• 大量texture读取
• Ray marches
• 嵌套循环


塑形部分

Volumetric Cloudscapes(一):理论_第3张图片

Volumetric Cloudscapes(一):理论_第4张图片
根据高度的不同种类的云,与产生原因


通过Ray Marching生成云,从相机开始March,采样3D Noise和一些 gradients来定义云的形状
可以算出云的半透明部分(通过厚度),并计算光照(散射)

Volumetric Cloudscapes(一):理论_第5张图片

通过 layering Perlin noises of different frequencies来模拟 Fractal Brownian Motion分形布朗运动

Volumetric Cloudscapes(一):理论_第6张图片

只有Perlin无法模拟出 cauliflower shape,所以将Perlin与 Worley噪声混合

Volumetric Cloudscapes(一):理论_第7张图片

使用两张3DTex 一张2DTex

Volumetric Cloudscapes(一):理论_第8张图片

Volumetric Cloudscapes(一):理论_第9张图片
这张3DNoiseTex用来生成云的基本形状,基本形状如上图

Volumetric Cloudscapes(一):理论_第10张图片

Volumetric Cloudscapes(一):理论_第11张图片

这张3DNoiseTex用来添加云的细节,添加细节如上图

Volumetric Cloudscapes(一):理论_第12张图片

curl noise. Which is non divergent and is used to fake fluid motion. use this noise to distort our cloud shapes and add a sense of turbulence
用来模拟大气湍流效果,扰动云的形状

Volumetric Cloudscapes(一):理论_第13张图片

可以算出这个Gradient,而不是采样贴图,,会省一点

Volumetric Cloudscapes(一):理论_第14张图片

首先,采样第一个3d纹理,并将其乘以高度信息,构建一个基本的云形状。
再乘以云层覆盖率,并降低云层底部的密度。
会使云层底部 whispy,因为云的密度随高度增加

Volumetric Cloudscapes(一):理论_第15张图片

在云的边缘部分减去第二个3DNoiseTex来为云增加细节,并用 2d curl noise来扭曲这个noise来模拟大气湍流

Volumetric Cloudscapes(一):理论_第16张图片
天气通过两个参数来控制:云的覆盖率和云的类型

Volumetric Cloudscapes(一):理论_第17张图片
通过一张weather tex来驱动云层的天气效果,R通道为coverage,G通道为precipitation,B通道为cloud type
因为是贴图,所以可以通过美术来控制天气效果

Volumetric Cloudscapes(一):理论_第18张图片

使云与山交互可以调整地球半径以及大气层高度(RayMarch采样高度)

Volumetric Cloudscapes(一):理论_第19张图片

构建的云有两种细节,一种只有基本形状(采样一张3DNoiseTex),一种高细节并且有扰动(采样两张3DNoiseTex和一张2D curl noise Tex)
有预设的几种云的参数来模拟根据云层高度云密度的不同和云覆盖程度的不同,
所有云根据风的方向来运动

光照部分

Volumetric Cloudscapes(一):理论_第20张图片

directional scattering
sliver lining
dark edges
实现这三种云的光照效果

Volumetric Cloudscapes(一):理论_第21张图片
大多数光线在进入我们的眼睛之前,都要经过云内水滴和冰的折射。
当光线最终离开云层时,它可能已经被云层散射吸收,或者与其他光线结合在一起,形成所谓的内散射

Volumetric Cloudscapes(一):理论_第22张图片

Beer’s law  的意思是可以根据介质的光学厚度来确定到达某一点的光的数量,所以可以通过 Beer’s law来计算云中某一点的光量
用云的穿透率和深度来代替云的厚度,光能随深度呈指数递减


还有另一个部分贡献了光能,是光以一定概率在云中向前或向后散射的部分

Volumetric Cloudscapes(一):理论_第23张图片

用 Henyey-Greenstein光照模型来模拟Anisotropic scattering

Volumetric Cloudscapes(一):理论_第24张图片

每次采样计算光能时,都要乘上 Henyey-Greenstein相位函数

Volumetric Cloudscapes(一):理论_第25张图片
黑边的产生原因是云内部会收到更多散射的光,表面相对就会暗

Volumetric Cloudscapes(一):理论_第26张图片

在成堆的糖粉中也有类似的效果

Volumetric Cloudscapes(一):理论_第27张图片

用powder  function来模拟黑边的效果,将Beer与 powder 两种方法结合起来

Volumetric Cloudscapes(一):理论_第28张图片

 beer’s law 负责主要的散射
powder sugar effect来模拟黑边

Volumetric Cloudscapes(一):理论_第29张图片

离太阳远的云黑边效果会增加

Volumetric Cloudscapes(一):理论_第30张图片

雨云增加光照吸收,所以比较黑

Volumetric Cloudscapes(一):理论_第31张图片

通过上面四个方面描述光照


实现部分

Volumetric Cloudscapes(一):理论_第32张图片

云在大气的不同层中分布着

Volumetric Cloudscapes(一):理论_第33张图片
分为底层云与高空的云,高空的云很薄,可以用2D贴图滚动来实现

Volumetric Cloudscapes(一):理论_第34张图片
采样分两种细节层次

Volumetric Cloudscapes(一):理论_第35张图片
到了表面使用高细节,在云中使用低细节

Volumetric Cloudscapes(一):理论_第36张图片
连续几次0密度的采样后切换到低细节采样,等到有值了之后在切换为高细节

Volumetric Cloudscapes(一):理论_第37张图片

如果厚度足够厚alpha值为1,就可以退出Ray Marching循环

Volumetric Cloudscapes(一):理论_第38张图片

获取光学深度,向光照方向采样6次,得到6个相邻采样点的密度

Volumetric Cloudscapes(一):理论_第39张图片

当alpha达到0.3时就切换为低细节

Volumetric Cloudscapes(一):理论_第40张图片

光学深度为d,光能随云中深度衰减

Volumetric Cloudscapes(一):理论_第41张图片

通过采样滚动的2D tex来模拟高空的云

Volumetric Cloudscapes(一):理论_第42张图片
上图有不同类型的卷云和中音云,它们以不同的速度和方向在体积云的上面滚动。

Volumetric Cloudscapes(一):理论_第43张图片

通过下面几点来实现24h光照效果:
• 云层高度越高环境色比重越大
• 方向光颜色为sun color
• 根据深度云会被大气盖住(接近地平线淡出)

Volumetric Cloudscapes(一):理论_第44张图片

先不管在云中的情况。。
每个ps要处理64-128次ray march for循环,每个循环里还要采样6次 light samples(手机感觉扛不住)
light samples在一定深度会换成低细节

优化部分

Volumetric Cloudscapes(一):理论_第45张图片

降为1/4分辨率画云

Volumetric Cloudscapes(一):理论_第46张图片

half res绘制完成后再 upscale到full res
最终这个云在ps4上跑2ms

参考:
http://advances.realtimerendering.com/s2015/
The Real-time Volumetric Cloudscapes of Horizon: Zero Dawn

-----by wolf96 2019/4/9

你可能感兴趣的:(Shader)