Cesium中实现阴影率分析

看到群里有人在研究这个,所以看了一下。主要是模仿超图的 阴影率分析 ,实现原理超图有做回答:

超图原理

但其实超图的这个实现方式还是过于复杂,原因是:既然是获取太阳的日照阴影,而 Cesium 中原本就存在太阳,且能投射阴影,因此其实并不需要再次计算太阳位置并计算视锥获取深度图,直接使用 Cesium 原生的太阳深度图即可。

改进后的实现原理

改进的方向主要是直接利用原本就存在的太阳阴影深度图:

  1. 生成测试点。
  2. 开启阴影效果,设定时间范围,并使时间开始流动。
  3. 时钟每次 tick 都获取一次当前的深度图。
  4. 计算每个测试点投影回太阳深度图上的位置和深度。
  5. 通过比较深度判断是否在阴影里。
  6. 统计结果并展示

加速计算

事实上如果直接按照上面的思路来会发现,计算效率很低,会导致浏览器的卡顿。那么怎么提升计算效率呢?

通过观察可以发现,上面的计算过程其实就是每个测试点都进行一次相同的操作,这种计算就非常适合放到 GPU 中进行。

因此我们其实可以创建一个 DrawCommand ,传入所有点的位置和当前的阴影信息,编写着色器完成上述计算,将结果输出成纹理,最后从纹理上读取结果即可。

实际效果

更多

不要忘记一键三连,栓 Q!


Cesium中实现阴影率分析
https://www.liaomz.top/2023/04/18/cesium-zhong-shi-xian-yin-ying-lu-fen-xi/
作者
发布于
2023年4月18日
许可协议