Volumetric Cloudscapes:理论
Posted wolf96
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Volumetric Cloudscapes:理论相关的知识,希望对你有一定的参考价值。
billboard云没办法实现云间的阴影,所以要做一块 voxel clouds
voxel clouds有一些缺点会很耗
• 大量texture读取
• Ray marches
• 嵌套循环
塑形部分
根据高度的不同种类的云,与产生原因
通过Ray Marching生成云,从相机开始March,采样3D Noise和一些 gradients来定义云的形状
可以算出云的半透明部分(通过厚度),并计算光照(散射)
通过 layering Perlin noises of different frequencies来模拟 Fractal Brownian Motion分形布朗运动
只有Perlin无法模拟出 cauliflower shape,所以将Perlin与 Worley噪声混合
使用两张3DTex 一张2DTex
这张3DNoiseTex用来生成云的基本形状,基本形状如上图
这张3DNoiseTex用来添加云的细节,添加细节如上图
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
用来模拟大气湍流效果,扰动云的形状
可以算出这个Gradient,而不是采样贴图,,会省一点
首先,采样第一个3d纹理,并将其乘以高度信息,构建一个基本的云形状。
再乘以云层覆盖率,并降低云层底部的密度。
会使云层底部 whispy,因为云的密度随高度增加
在云的边缘部分减去第二个3DNoiseTex来为云增加细节,并用 2d curl noise来扭曲这个noise来模拟大气湍流
天气通过两个参数来控制:云的覆盖率和云的类型
通过一张weather tex来驱动云层的天气效果,R通道为coverage,G通道为precipitation,B通道为cloud type
因为是贴图,所以可以通过美术来控制天气效果
使云与山交互可以调整地球半径以及大气层高度(RayMarch采样高度)
构建的云有两种细节,一种只有基本形状(采样一张3DNoiseTex),一种高细节并且有扰动(采样两张3DNoiseTex和一张2D curl noise Tex)
有预设的几种云的参数来模拟根据云层高度云密度的不同和云覆盖程度的不同,
所有云根据风的方向来运动
光照部分
directional scattering
sliver lining
dark edges
实现这三种云的光照效果
大多数光线在进入我们的眼睛之前,都要经过云内水滴和冰的折射。
当光线最终离开云层时,它可能已经被云层散射吸收,或者与其他光线结合在一起,形成所谓的内散射
Beer’s law 的意思是可以根据介质的光学厚度来确定到达某一点的光的数量,所以可以通过 Beer’s law来计算云中某一点的光量
用云的穿透率和深度来代替云的厚度,光能随深度呈指数递减
还有另一个部分贡献了光能,是光以一定概率在云中向前或向后散射的部分
用 Henyey-Greenstein光照模型来模拟Anisotropic scattering
每次采样计算光能时,都要乘上 Henyey-Greenstein相位函数
黑边的产生原因是云内部会收到更多散射的光,表面相对就会暗
在成堆的糖粉中也有类似的效果
用powder function来模拟黑边的效果,将Beer与 powder 两种方法结合起来
beer’s law 负责主要的散射
powder sugar effect来模拟黑边
离太阳远的云黑边效果会增加
雨云增加光照吸收,所以比较黑
通过上面四个方面描述光照
实现部分
云在大气的不同层中分布着
分为底层云与高空的云,高空的云很薄,可以用2D贴图滚动来实现
采样分两种细节层次
到了表面使用高细节,在云中使用低细节
连续几次0密度的采样后切换到低细节采样,等到有值了之后在切换为高细节
如果厚度足够厚alpha值为1,就可以退出Ray Marching循环
获取光学深度,向光照方向采样6次,得到6个相邻采样点的密度
当alpha达到0.3时就切换为低细节
光学深度为d,光能随云中深度衰减
通过采样滚动的2D tex来模拟高空的云
上图有不同类型的卷云和中音云,它们以不同的速度和方向在体积云的上面滚动。
通过下面几点来实现24h光照效果:
• 云层高度越高环境色比重越大
• 方向光颜色为sun color
• 根据深度云会被大气盖住(接近地平线淡出)
先不管在云中的情况。。
每个ps要处理64-128次ray march for循环,每个循环里还要采样6次 light samples(手机感觉扛不住)
light samples在一定深度会换成低细节
优化部分
降为1/4分辨率画云
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
以上是关于Volumetric Cloudscapes:理论的主要内容,如果未能解决你的问题,请参考以下文章