水面是透明
要用到深度测试
首先我们要获得水面与地面的边界
SceneDepth
节点,可以取得当前屏幕坐标下像素点的深度。即当前屏幕坐标下,包含本物体在内,屏幕上的物体和相机裁剪平面的距离。这个值包含半透明物体
。ScreenPosition
节点,得到四个值,xyzw,其中w,同样是深度。即当前屏幕坐标下,包含本物体在内,屏幕上的物体和相机裁剪平面的距离。这个值不包含半透明物体
。所以它们相减就能得到
相交边缘
。==因为这个点有半透明物体,它的背后有不透明物体。如果半透明物体和不透明物体重合,则差值为0==(为0就是黑色),如果不重合,则差值越大,半透明物体的表面距离不透明物体就越远。注意,渲染本身是有顺序的,也就是说,运行到这个着色器时,所得到的这些值,全部都是在这个着色器运行之前及运行中的状态。
那么,按照渲染顺序来说,如果比这个着色器的物体后渲染的物体,其深度则不会参与当前着色器的计算。 —-作者:游戏石匠Super https://www.bilibili.com/read/cv15381152 出处:bilibili
现在我们可以得到边缘 (颜色为0) 因为相减
在用一个变量(EdgeWieght)增加差值
再用一个变量(Strength)控制平滑过渡
用clamp控制边缘值在(0-1)