Unity引擎制作海面效果
大家好,我是阿赵。
继续做海面效果,上次做完了漫反射颜色和水波动画,还有法线和高光效果。
原则上来说,这个海面已经基本能看了,从性能的考虑,到这里差不多可以停止了。不过有些细节还是可以补充一下。
一、 岸边泡沫
之前介绍过怎样做跟随着水面升降的泡沫效果,这里可以加一下。
主要用到的是深度,在ASE里面有专门获取深度的节点
这个节点为我们做了很多事情,获取非线性渐变的摄像机深度图,再转换成LinearEyeDepth的线性深度。
去掉漫反射和高光颜色,单独看这个深度计算的结果,可以看到了,在这个泛白的范围,就是我们想显示泡沫的区域。
接下来,找一张泡沫的图,然后在这个区域里面做一个显示就行。我是拿了水波的高度图增加了平铺次数来当做泡沫显示了
这时候,可以看到刚才泛白的地方,显示出了和普通水波纹不一样的一些泡沫的纹理
加上之前做的漫反射和高光,会是这样的效果:
但又一个问题,一般这种泡沫是会随着波浪拍打而变化的,如果我现在这样就静止不动,看起来会很怪。所以需要让它动起来。
这里有多种方案,我分享2种:
1、 制作水面的顶点动画
由于这个水泡沫的范围是通过深度计算出来的,如果水面变化,那么深度范围也会跟着变化。
所以,可以给海的面片做一个顶点动画。不过由于这个是一个面数不多的面片,做顶点动画会由于顶点不足而不好看,还要做一个根据距离变化的曲面细分,让岸边的部分网格顶点数增加。
由于这样做比较麻烦, 而且性能也不怎么好,所以我就没这么做了。
2、 动态变化深度范围。
由于刚才泛白的范围,其实也是通过深度计算出来的,所以我们也可以通过给计算深度的距离增加一个参数,乘以一个sin时间,让它做一个来回往返的变化范围动画。
大概是这一个部分了,增加了一些参数,让它能调节往返的幅度,还有强度。
结合着之前计算的菲涅尔范围做透明度,得到了一个范围。这时候,泡沫看起来就动起来了。
泡沫会沿着深度的方向往返变化范围,泡沫也就像拍打岸边一样变化了。
二、 海平线
现在看起来画面有点像样了,不过有个问题,在海天相接的地方,现在的海平面边缘会比较硬,我希望能在海平线的地方,不要那么生硬。
这里的算法有很多选择,我用了一个简单的计算距离的方式,通过摄像机位置和世界顶点坐标求距离,然后再通过两个参数控制缩放范围:
单独显示这个数值,会看到现在海平线的位置有一个白边:
通过调节参数,可以控制白边的宽度:
把之前做的所有效果加起来,就能看到:
现在出现了一个海平面的效果