05.水面效果(上):深度测试

  • 水面是透明

    Snipaste_2023-04-18_18-27-47

  • 要用到深度测试

    Snipaste_2023-04-18_18-29-57

  • 首先我们要获得水面与地面的边界

    Snipaste_2023-04-19_10-24-48

  • SceneDepth节点,可以取得当前屏幕坐标下像素点的深度。即当前屏幕坐标下,包含本物体在内,屏幕上的物体和相机裁剪平面的距离。这个值包含半透明物体

    ScreenPosition节点,得到四个值,xyzw,其中w,同样是深度。即当前屏幕坐标下,包含本物体在内,屏幕上的物体和相机裁剪平面的距离。这个值不包含半透明物体

    所以它们相减就能得到相交边缘。==因为这个点有半透明物体,它的背后有不透明物体。如果半透明物体和不透明物体重合,则差值为0==(为0就是黑色),如果不重合,则差值越大,半透明物体的表面距离不透明物体就越远。

    注意,渲染本身是有顺序的,也就是说,运行到这个着色器时,所得到的这些值,全部都是在这个着色器运行之前及运行中的状态。

    那么,按照渲染顺序来说,如果比这个着色器的物体后渲染的物体,其深度则不会参与当前着色器的计算。 —-作者:游戏石匠Super https://www.bilibili.com/read/cv15381152 出处:bilibili

Snipaste_2023-04-19_10-53-38

Snipaste_2023-04-19_10-46-36

现在我们可以得到边缘 (颜色为0) 因为相减

  • 在用一个变量(EdgeWieght)增加差值

  • 再用一个变量(Strength)控制平滑过渡

  • 用clamp控制边缘值在(0-1)

    Snipaste_2023-04-19_10-51-30