基于网格的无限大战争迷雾实现方案

    战争迷雾常见的实现方案是使用一张贴图存储地图上每个格子有无迷雾,然后对这样贴图进行模糊后作为mask,可以实现边缘柔和渐变的迷雾效果。如果地图大小是固定的,那么使用采用固定的一张或多张贴图的方案,覆盖整个地图。但是如果地图是无限大的,那么随着摄像机的移动,这些贴图必然要比较频繁地更新,而每次更新都需要重新进行模糊,根据实际情况性能不一定好。这里给出一个基于网格的无限大战争迷雾实现方案。

    首先创建一个Mesh,里面有N个跟地图上的格子形状大小都一样的迷雾块,数量足够铺满整个屏幕。这个Mesh就像是个对象池,对象就是里面的每个迷雾块。

    当摄像机移动时,移出屏幕的迷雾块被回收,填补到屏幕的另一侧。摄像机移动的时候只需要改变Mesh里相应的迷雾块的顶点位置即可。通过这种方式不管地图有多大,都能保证有足够的迷雾挡在摄像机前。

    为了实现边缘柔和渐变的效果,需要把迷雾块的顶点在vertex shader里沿法线往外延伸一段距离,延伸的距离越大,alpha越低。alpha值可以通过采样类似于这样的贴图获得:

    要得到比较好的柔和渐变效果的话,向外延伸的距离就要比较大,这样会导致屏幕重绘率加大。解决办法是分两次绘制。第一次绘制不延伸的Mesh,完全不透明,Zwrite=On。第二次绘制向外延伸的Mesh,启用Alpha Blend,ZTest=Less, Zwrite=Off,Mesh往摄像机前方的方向移动一点点,以避免ZFighting。这样完全不透明的部分就不会重复绘制。

    另外这个方案要做迷雾消散动画也比较简单,只要在vertex shader里面操作顶点坐标即可。例如简单的迷雾块平移的消散动画,只要外部把移动方向和移动速度传给shader,然后vertex shader里v.vertex += _MoveDir * _MoveSpeed * _Time.x即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值