同样在这篇文章开始前重申一下:山海鲸并没有使用 ThreeJS 引擎!但由于 ThreeJS 引擎使用广泛,下文中直接用 ThreeJS 同 CesiumJS 的整合方案代替山海鲸中 3D 引擎和 CesiumJS 整合。
系列传送门:
山海鲸可视化:GIS 融合之路(一)技术选型 CesiumJS/loaders.gl/iTowns?
山海鲸可视化:GIS 融合之路(二)CesiumJS 和 ThreeJS 深度缓冲区整合
山海鲸可视化:GIS 融合之路(三)CesiumJS 和 ThreeJS 相机同步
山海鲸可视化:GIS 融合之路(四)如何用 CesiumJS 做出 Cesium For Unreal 的效果
上一篇文章我们已经将大气散射和空气透视的效果整合到了 CesiumJS 之上,不过真实感渲染除了大气部分,还有体积云和高度雾。照例我们先看下山海鲸中的效果图:
山海鲸体积云效果
山海鲸高度雾效果
具体山海鲸中的效果和设置教程,可以移步这个的视频教程的前半部分的内容:
【山海鲸可视化 GIS 系统】第十课 CesiumJS 项目移植
感兴趣朋友也欢迎下载软件试一试:
山海鲸可视化-一站式数字孪生开发平台-海量数据可视化大屏模板
相比于大气散射来说,体积云可以说要复杂的多,主要复杂在以下几个方面:
实际上,体积云也已经有了海量的文章在解释如果去建模和光照了,我也大体给大家总结一下方案的脉络。体积云目前的方案主要是由地平线最先提出,后期经过寒霜、荒野大镖客等引擎或 3A 游戏的进一步完善,逐渐形成了一套标准的方案。也就是通过Worley-Perlin 噪声贴图进行建模,同时使用太阳和大气对体积云进行光照计算。
除了几篇英文的 ppt 分享外,比较推荐大家去看网易这篇分享文章,基本综述了当前的体积云算法,同时也非常全面,我就不再重复技术细节了:
网易游戏雷火事业群:体积云效果的实现,游戏世界的云合雾集
这套基本的逻辑还是比较容易实现了,我们看下山海鲸中体积云的建模效果和光照效果:
山海鲸中体积云效果
补充一下在山海鲸中体积云的实现的一些具体的要点:
说完了体积云之后,我们看下指数高度雾。上一篇文章已经提到过了,大气散射已经是高度指数雾了,无论是瑞丽散射和米氏散射的密度分布都是高度指数递减的,为什么我们还要再加上高度指数雾呢?实际上因为两点:
OK,我们将体积云和高度雾实现了之后,同样和上一篇文章一样,我们叠加到 CesiumJS 中只需要使用Cesium Color Texture和Cesium Depth Texture两张贴图即可实现体积云和高度雾的叠加。到这一步位置,我们基本上将天空部分的效果整合完毕了,下一步我们就看一下如何结合天空来实现 Cesium 中的雨雪效果和雨雪覆盖。