Cesium中实现全球体积云

RayMarching

RayMarching 也就是光线步进,是 3D 图形学中的一种渲染方法,常常用来作为体渲染的主要渲染方式。

基本实现原理是,在每个像素上计算一条光线,当光线进入体纹理范围内后,将光线细分成更小的光线片段进行步进迭代,每次步进时计算相应的强度信息。最终迭代结束后,将所有步进结果进行叠加计算,得到像素的颜色

在这里插入图片描述

体积云

体积云是利用 RayMarching 方式渲染的云效果,在一些大型游戏中很常见。

与其他渲染云的方式不同,体积云是真正具有体积感的云,一个最简单的区分方式是,体积云能够进入到云的“内部”

在这里插入图片描述

如何渲染云

体积云的渲染步骤大致为:

  1. 计算每个像素的光线方向
  2. 计算沿光线方向是否能够和体积云范围相交
  3. 获取相交范围,并在该范围内进行光线步进
  4. 根据步进结果计算云的基础形状(也就是云的密度)
  5. 计算云的光照

而其实,上面列的步骤中,1-3 均为 RayMarching 的实现。因此事实上,真正渲染体积云的步骤只有两个:计算强度和计算光照。

云的密度:
云的密度

云的光照:
云的光照

计算云的密度

体积云的密度计算比较简单,只需要在 RayMarching 的过程中,采样相应的噪声图,并累加噪声结果,直到达到噪声最大值或者结束步进。

最终累加的结果就是云的密度。

float cloudDensity = 0;
for(int iii = 0; iii < _Iteration; iii++) {
    float3 stepPos = startPos + iii * _StepLength;
    cloudDensity += SampleNoise(stepPos);

    if(cloudDensity > MaxCloudDensity){
      cloudDensity = MaxCloudDensity;
      break;
    }
}

计算云的光照

通常,体积云的光照分为两个部分:

  1. 总光能(当前位置接收到的总光能)
  2. 光能反射比例(当前位置的总光能有多少能够进入到眼睛)
总光能

在每一个点,向光源方向再做步进,累加噪声值得到该点在光源方向的“深度”。

举个例子:

在某点向光源方向做 8 次步进,前 3 次在云的内部,后 5 次在云的外部。

该点的深度为(1 + 1 + 1 + 0 + 0 + 0 + 0 + 0)/ 8 = 0.375。

光能反射比例

我们算出了一个点接收到的总光能,但这些光能只有一部分能反射到我们的眼睛(摄像机)。

从该点向摄像机方向做步进,累加噪声值得到该点在摄像机方向的“深度”,深度越大损失的光能越多。

传递到摄像机的光能 = 接收到的总光能 - 中途损失的光能。

蓝噪声

体渲染通常对性能消耗是很大的,因此为了保证帧数,体积云的渲染会采用较低的步进次数,这样做会导致云渲染出现分层。

为了解决这种问题,通常需要使用噪声对步进的起始点进行扰动。

椭球体

由于 Cesium 是 GIS 相关的渲染引擎,因此体积云必须考虑适配 Cesium 的地球形状。

解决方式是,以云最低高程和最大高程,依据 WGS84 椭球外扩两个椭球范围。并以这两个椭球范围作为体渲染的范围进行 RayMarching 计算即可。

实际效果展示

Cesium全球体积云

参考资料

RayMarching 实时体积云渲染入门(上)
RayMarching 实时体积云渲染入门(下)
体积云渲染(Volumetric Clouds),技术美术教程
Unity URP RayMarching 体积云

原文链接

Cesium中实现全球体积云

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium是一个用于创建三维地球和宇宙可视化的开源JavaScript库。它可以通过Web浏览器无缝地展示具有高精细度的大规模地理和时空数据。要实现内嵌体积效果,我们可以借助Cesium的功能和一些额外的技术来完成。 首先,我们需要获取体积的数据。体积数据通常是由大量离散点或网格表示的,表示不同位置上的密度或的各种属性。可以将这些数据存储在后端服务器上,并使用网络请求将数据传输到前端。Cesium提供了支持加载和渲染此类体积数据的功能,我们可以使用这些功能来加载数据。 然后,我们需要将加载的数据与Cesium的地球模型进行融合。通过使用Cesium图形接口,我们可以将数据绑定到地球的场景,并使用适当的纹理、材质和光照效果来呈现体积。可以调整的透明度、密度和颜色等属性,以便实现更真实的效果。 此外,为了实现交互性和动态效果,我们可以结合Cesium的动画和用户交互功能。通过使用动画功能,可以使的运动和变化更加流畅自然。例如,可以根据气候数据或预设的模型对的位置、形状和密度进行动态调整。而通过用户交互功能,用户可以自由浏览场景,并与进行交互,例如旋转视角、缩放和漫游。 总结起来,要实现内嵌体积,我们需要使用Cesium加载和渲染数据,将与地球模型融合,并在需要时实现动态和交互效果。这样,我们就可以通过Cesium创建一个逼真的体积效果,提供更加沉浸和交互的三维场景体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值