现实生活中,地面上经常会有云彩的影子在移动,它其实就是通过太阳光将其投射到地面上的,这个应用在游戏中跟人的感觉场景比较真实,在FoxHole散兵坑游戏中就实现了这个效果,如下图所示:
实现类似的效果方法有两种:一种是常用的方法,就是使用一个天空盒,再实现一个飘动的云层,然后通过平行光将其投射到地面上,虽然比较好理解,这种方法不推荐,运行效率也会受影响。另一种方法就是我们本篇博客需要实现的,通过改变纹理的UV,实现移动效果。下面具体介绍如何实现
首先我们要整一个平面将阴影渲染到上面去,这里不是指RenderTexture,这个平面设置的时候需要一点小技巧就是它的位置和大小跟摄像机的远裁剪面是一样的,效果如下所示:
上图是我们需要将云层绘制的平面区域,下面是摄像机的远裁剪面,如下所示:
下面是通过代码实现二者的一致性,先实现四边形与摄像机远裁剪面位置一致:
Camera cam = Camera.main;
float dist = cam.farClipPlane - 0.1f; // 0.1 is some magic value to avoid culling
Vector3 campos = cam.transform.position;
Vector3 camray = cam.transform.forward * dist;
Vector3 quadpos = campos + camray;
transform.position = quadpos;
还有四边形平面与摄像机远裁减面的大小要一致:
Vector3 scale = transform.parent ? transform.parent.localScale : Vector3.one;
float h = cam.orthographic ? cam.orthographicSize * 2f : Mathf.Tan(cam.fieldOfView * Mathf