一.水波纹着色器
首先采样法线贴图,然后使用Panner节点滚动UV制造出水在流动的效果。这里使用绝对世界坐标采样的原因是因为这样可以将水映射到世界空间中的水的平面上,而且我可以使用多个平面,水的效果就会平铺在平面上。
接下俩要往波纹中制造一些混乱。所以又做了一层UV扰动并且将两次采样的结果相加,这里的DeriveNormalZ它会取用由这两个法线贴图生成的X和Y,而且它会计算Z,
但是可以注意到前面两个缩放几乎相同,分别是0.0035和0.003. 我们呢可以创造一个非常大的图像,就像是些非常大的波纹在缓慢横穿表面
最终效果:
二.水深度着色器
制作水深度着色器首先要将材质的BlendMode设置成Translucent。然后需要计算出深度。因为谁的深度和我们看向水的角度决定了水的不透明度。当水变得越深,它就会越浑浊,也就是不透明
虚幻引擎里有两个节点可以用来测量深度,第一个是Scene`Depth(场景深度)节点,第二个是Pixel Depth(像素深度)节点,Scene Depth节点测量的是"摄像机的位置一直到水底的距离,这将发送一个数组 让其通过当前的透明对象,并击中它后面的任何东西,Pixel Depth节点 作用是提供摄像机到水面的距离,因此要是我用 Scene Depth减去Pixel Depth,就可以得到下面这个蓝色向量,它是水面到水面底下的距离 并且一直沿着摄像机向量,这样就能求出水的深度。
然后将深度输出成颜色在场景中查看效果,获得深度以后除上一个值,表示水的深度,然后使用power节点可以控制水的消退曲线,增强暗部的表现,因为传入这个基础颜色引脚的数据是为伽马调整的,所以我们加上power节点撤销伽马矫正。
所以场景里越接近白色的地方代表越深
但是垂直和水平看得到的深度是不一样的,下面是水平看的结果
事实上当我们视角接近水平的时候,会法线深度向量变长了,所以角度越低 水看起来就越不透明
我们需要计算一个真正的水面的深度,就像下面这样
下面是计算过程,要将绝对世界坐标和相机位置减去水面高度转换到水的高度空间,然后将将光线从绝对世界位置投射到摄像机位置
然后现在无论怎么切换视角水面的深度都不会发生变化了
不过使用这种精确的深度值有一个缺点,如果你有一个不平坦的水平面,比如要是你做的是一条顺山而不的河流,你就无法用这个高度值得到个很好的效果,或者说有一大堆水平面,但你不想给它们每-个都输入高度,这两种情况都可以选择去使用SceneDepth-PixelDepth的近似版本。
但是我们观察的角度也会对水面的不透明度有影响。所以加入一个菲涅尔节点,这个节点是计算表面法线与观察方向的点积,当法线与观察向量平行的时候,返回1
所以将菲涅尔的结果与上一步的结果相加
然后当我接近水平角度 观看的时候,深度是不透明的
然后当我接近垂直角度 观看的时候,深度是透明的
但是目前为止还没有使用法线,我们之前计算的水面波纹法线实际上是在切线空间的,但是菲涅尔节点需要的节点是世界空间的,只要我们将法线输出到根节点,它就会被转换成世界空间的。然后我们 就可以使用pixelNormal节点使用世界空间法线。
但是目前根节点的法线是灰色的,说明不需要输入,所以还需要去细节面板将照明模式修改为表面半透明体积,可以看到水面已经有了波纹的效果了
在边缘处 岩石和水之间有一条很硬的线,我们需要将其淡化一些
可以使用DepthFade节点,它有两个参数,不透明度和默认淡化距离。
可以看到在所有岩石与水平面相交的地方,颜色变得更暗了,这意味着在这些区域里水会变得更透明
然后就可以将计算好的不透明度连接到根节点的Opacity上。在不透明的地方 水是默认的深黑色,在透明的地方 你可以透过水看到深处
接着可以给水设置颜色。因为深水和浅水的颜色是不同的,所以分别设置两个颜色,然后根据不透明度插值,