本文介绍假反射水面与水下效果的制作。本文所用到的贴图你可以尝试在网络上搜索。

水面的模型其实就是一个普通的平面,放置一个平面在需要制作湖水的地方。创建一个材质把着色模型改为半透明。
水面波浪

水面我们采取HDR贴图做一个假反射,reflection vector连接到uv。上面的RotateAboutAxis可以让图片旋转。乘一个三维向量可以改变HDR贴图的颜色。关于RotateAboutAxis的使用可以参考风格化草的草倒塌部分。
接下来是制作波纹部分。准备一张水波纹的法线贴图。水面波浪是在世界位置中,所以使用绝对世界位置的xy轴连接到法线贴图的uv。因为绝对世界位置是一个较大的数,所以需要乘一个较小的数。要使水波纹可以移动,可以用Panner移动节点,Panner节点的speed引脚可以控制移动方向与速度。我们可以做两层法线,其中一个uv密度大,另一个小,就能做出大波纹中小波纹的效果,层次感更加丰富。最后用BlendAngleCorrectedNormals混合法线。波浪在世界中,所以用转换节点转换为世界场景空间。

水深模拟

从左到右的第一个lerp上alpha通道连接的那块节点是水深度公式。下图为水深度计算的讲解。

相机位置减绝对世界位置取B通道等于相机与水面的高度。用一个相似比,场景深度除以像素深度等于相机与水面高度加水深度除以相机与水面的高度。这样就可以计算出水深度。加一个除法控制,当深度大于除数时,值为1(因为后面有钳制节点),当深度小于除数时,值就为0到1之间的数。power节点,当幂在0到1之间会使0到1之间的小数变大。
我们想使一定深度的水颜色改变,这里演示为发绿,而浅水区由清逐渐变绿,所以lerp的A节点为场景颜色,B节点是场景颜色乘要偏向的颜色。
下一个lerp是利用菲涅尔将深度与波浪混合。菲涅尔效果介绍:菲涅尔效果 – 吟吟低语
我们想使面前的波浪少一些,透明度高一些,而远处的波浪反射更加明显,所以把水面波浪连接到lerp的B节点,水深度连接到A节点,输出端连接到自发光颜色就可以看看效果了。如果你发现远处的发射效果不明显可以调整HDR贴图或增大与HDR相乘的那个三维向量的数值。

水下物体扭曲效果

取水面波浪部分混合法线输出的结果取RG通道,也就是xy轴,这样就获得了水的波动效果,乘一个噪声图片打乱它,再乘一个数用来调整强度,最后加上ScreenPosition。ScreenPosition的视口UV节点是以屏幕窗口为uv坐标,让扭曲效果改变屏幕uv的排列,这样就实现了屏幕uv的扭曲。把这个uv连接到深度部分的SceneDepth与ScreneColor,这样通过水面看在水下的物体就感觉它有一种扭曲的效果。
岸边泡沫

制作泡沫的思路与波浪类似,把法线贴图换成泡沫贴图,混合节点之间简单相加就能把两张贴图简单叠加。做好泡沫后需要把它与我们原来做的效果都混合起来。我们需要做一个遮罩,这个遮罩是水与岸边的交界处。这里要使用一个节点:DepthFade
不透明(Opacity):接收深度消退前对象的现有不透明度。
FadeDistance(消退距离):这是应该发生消退的全局空间距离。
用power节点调整交界处的过渡程度,然后钳制在0到1之间,连接在Alpha通道上。因为交接处的值为0(黑色),所以把泡沫效果的节点连接在A,把之前做的所有节点最后一个lerp的输出连接在B上。这样,泡沫效果就与我们之前做的效果混合了。

至此,水面的效果就做好了,接下来是水下的效果。
水下能见度与扭曲效果

水下的效果是由后期处理体积实现的。新建一个后期处理体积,用它覆盖在原来的水坑。为了方便调整可以在线框模式下进行。再新建一个材质,材质域改为后期处理。在后期处理体积的细节面板里的后期处理材质的数组里添加一个元素,然后赋予我们刚才创建的材质(你也可以为新建的那个材质创建一个材质实例,在这里赋予材质实例)。接下来我们来修改后期处理体积的材质。

上图两个SceneTexture连接的左边部分是水下扭曲效果,而包括自身与右边的节点是能见度部分。
能见度
SceneTexture:后期处理输入0:它输出的是场景本来的颜色,是一个四维向量。分离出RGB通道,直接连接到自发光颜色不会有任何变化,如果把它与一个颜色相乘就会改变看到的颜色。
SceneTexture:场景深度:类似于SceneDepth,会返回视线透过后期处理体积的看到的像素到摄像机的距离。
距离遮罩:用SceneTexture:场景深度取R通道。加一个除法控制,当距离大于除数时,值为1(因为后面有钳制节点),当深度小于除数时,值就为0到1之间的数。power节点,当幂在0到1之间会使0到1之间的小数变大。
当物体离我们较近时我们希望它能被我们看见,当物体较远时我们只能看见湖水的颜色。SceneTexture:后期处理输入0提前RGB通道,连接到A上面,B是湖水的颜色。
最终效果调节:Cheapcontrast_RGB调节对比度,乘法调节亮度,Desturation调节饱和度。
扭曲效果
它的原理类似于水面的扭曲效果。我们想使靠近我们的物体扭曲强度更小,远离我们的物体扭曲强度更大。SceneDepth加一个500的最大限制,是指达到最大扭曲强度的距离为500,500之后扭曲强度不再增加。上面两张噪声图添加移动并且用lerp混合扭曲效果与距离相乘,最后再乘一个数控制整体扭曲强度,因为SceneDepth是一个较大的值,所以使扭曲强度正常需要乘一个较小的值。最后叠加到屏幕uv,连接到两个SceneTexture的uv上。

水下视角暗角

屏幕暗角遮罩:用屏幕uv(因为前面也用到了这个节点,可以直接再拉一条线出来)减去0.5,进行点积,具体原理如下:

左侧的坐标是本来的uv坐标,减去0.5后变为右侧的坐标,点乘对坐标的运算方式为对应相乘相加,所以最后的结果为中心为0,四角为0.5。用1-x反向,这样中间就是1。用power节点更改效果,最后用clamp把数据钳制在一定区间,最大为1,最小可以用来设定最小的暗度,也就是四角的暗度情况。最后把它与我们效果相乘就好了。

焦散效果
水下的焦散效果是由灯光来实现的。
创建一个材质,在细节面板的材质域里选择光照函数。

导入焦散贴图,这三张贴图我们分别用移动节点来使其有动态效果。用乘法使效果简单混合在一起,再用乘法与加法调节亮度,连到自发光颜色。
添加一个矩形光源,它的高度与水面相同,让整体位置在湖中心,其衰减半径覆盖住湖。关掉投射阴影,在光照函数里选择我们刚才创建的材质。通过调节光源的强度、源宽度、源高度等参数调整实际效果。

至此,一个简单的水材质制作就完成了!