地平线:黎明时分中的云渲染技术

作者:风和雨林 2019-12-30


最简单的办法是采用raymarching,噪声可以简单的采用fbm,但是程序感严重



两种噪声叠加,Perlin-Worley noise,连续感减弱不少


一张基础的3d纹理,控制大体形状,一个通道存Perlin - Worley noise,其他三个存不同频率的Worley noise


一张细节3d纹理,不同频率的Worley noise


一张2d纹理,curl noise,一般用于流体模拟,可以对云进行distort,增加湍流感


在高度上使用纹理控制密度,可以表现层云,积云,积雨云

此外,在高度上整体设置一个0-1的渐变,因为低空没云



在云的边界处减去第二个3d纹理,能够得到侵蚀效果

小贴士,如果你把基础云层的Worley noise倒置,会得到一些不错的形状。

使用2d纹理去distort第二个3d纹理,可以模拟大气湍流造成的旋涡扭曲


用一张图去整体上控制云层,能够模拟不同天气下的表现,r通道表示密度,g通道表示降雨量,b为云形。天气系统通过在游戏过程中进行的模拟来调节这些通道。积雨云直接在头顶(白色),远处是规则的积云。我们可以让艺术家去控制这些模拟。


默认天气是积云和层云的组合。大部分是层云。

降水量达到0.7将会产生积云。


使用天气系统来确保地平线上的云层总是有趣的,并在山上分开。

从15000米的距离开始…在玩家周围35000米半径范围内绘制云景


渲染采用Beer’s law



前向散射几率更大,使用henyey greenstein function来矫正




此外,云层厚的地方in-scattered light更多,导致边缘会暗一些


加入powder函数,两个公式叠加去模拟这个效果




注意这个效果和方向光方向及视角方向有关


在有雨的地方增加光吸收率,来使其变暗


最终公式



地球是圆的,所以远处地平线会和云接在一起


1500米到4000米之间是体积云

海拔4000米以上是alto和卷云。上层云不是很厚,可以通过动画纹理模拟

由于存在基础噪声和细节噪声,只有在基础噪声返回非0时才需要检测细节噪声


为了不"错过",切换到高细节样本之前要向后退一步


当到达alpha为1时,也就是到最高点了,停止Raymarching


如果连续返回非0,切换到基础噪声,直到再次返回0


采样点数量和视角相关

注意密度会随高度衰减,也就是上面提到的0-1渐变

但是这样还不够

在朝向光的圆锥上采样6个点模拟阴影,最后一点距离要远一点

为了提高采样的性能,当alpha达到0.3时,切换到简单版本的着色器版本进行采样。这使着色器速度提高了2倍

6点采样在低空的贡献大于比尔定律,而随着高度上升,又会回到标准的体渲染方式


最后一步,采样最高层的二维纹理


以上是高空云层的几种形态


现实中,不同频率的光线在云中混合,会产生非常美丽的色彩效果。所以我们要根据以下模型为云上色:

  • 环境光贡献随高度增加而增加
  • 直接照明将以阳光颜色为主
  • 大气散射会随高度增加去替代云层颜色


优化:每帧渲染1/4

前一帧要reproject,如果是边缘,无法reproject,则从一个低分辨率buffer上采样


在half res下渲染,最后upscal

相关阅读:

作者:风和雨林

最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多