UnityShader——基于CustomRenderTexture的战争迷雾

Unity 2017版本推出了CustomRenderTexture,个人觉得是个很棒的东西,很多效果不需要再一层一层去申请 RenderTexture 然后 Blit, 而且 CRT 还提供了 UpdateZone 用来更新某一个区域,虽然性能上来说到底有没有提高没测试过不清楚,不过用起来是真的很方便,Unity.jp 的某位大佬用 CRT 实现的水波效果就非常有意思

说到战争迷雾,战争迷雾的实现方法有很多,其余大佬的博客也讲的很详尽了,其基础就是,我们需要知道地图哪些地方有迷雾,哪些地方没有,在地图有固定边界的情况下,我们就可以简单的用一张贴图来表示,最简单的情况下,只需要一个单通道的 R int 格式的图片,而 CRT 用来做这项工作简直再合适不过了

在简单的实现中步骤如下:
1、我们通过地图边界将地图中的 xz 方向世界坐标投影到 CRT 的 uv 坐标
2、然后在该区域调用 UpdateZone,你可以加上合适的 Mask 图片做渐变, 你也可以随机生成噪声
(Tip:UpdateZone 也支持传统模式的 Blend)
3、GlobalFog 的 shader 读取该 CRT 以控制雾效
4、Victory!

第一步非常简单,这里不做累述,第二步 Unity Manual 里面也基本上讲清楚了,第三步也很简单,GlobalFog 的实现我在之前的博客里面有分析过,Unity 已经帮我们把世界坐标都算好了,就叫 wsPos 摆在那等我们去用,我们要做的同样也只是根据地图边界将 wsPos.xz 投影到 CRT 的 uv 坐标然后采样, 根据采样结果来修改 fogFactor 就行啦!


UnityShader——基于CustomRenderTexture的战争迷雾_第1张图片

配合噪声的话能实现更加自然的效果


UnityShader——基于CustomRenderTexture的战争迷雾_第2张图片

当然,这里没有考虑视野被障碍物遮挡的问题,只是非常简单的实现,源码奉上

关于 CRT 的用处我感觉很多,像脚印,雨滴,水纹之类的效果特别适合用 CRT 来做,不过,只能是 to be continue 啦!

你可能感兴趣的:(U3D)