上一篇讲了水基本的折射和反射,这篇写一下如何做出浪花效果,如图:
基本思路就是用摄像机的深度纹理减去当前渲染物体的深度值,得到物体间的距离,然后用这个值对浪花纹理进行采样。
用这个值还可以做出水深度的变化,此处是用lerp对水底颜色和折射颜色进行插值,效果如图:
这里就用 shader graph解释一下,比较方便:
ScreenPosition(Raw)的w分量就是视角空间下的z值,SceneDepth就是摄像机深度纹理采样得到的深度值,注意这边的eye代表把深度值转换成了线性空间(视角空间)下的深度值,这样就可以直接和ScreenPos.w相减得到物体之间的距离。
代码版本如下,对深度纹理采样用的是屏幕坐标xy再做一下归一化除法得到真正的屏幕坐标:
除以edgethickness是为了控制边缘的距离。之后再saturate一下把它变到0,1的范围,以便后面对贴图采样。
用1去减一下配合后面的渐变贴图(从黑渐变到白),然后采样,乘以一个自定义的边缘颜色:
最后把颜色加到输出的颜色里就可以了。
模拟水越深显示的折射颜色越少,本身颜色越多,就用刚才saturate以后的值对两个颜色插值就行了:
代码:
这样深度纹理在水体中的应用就介绍完了。
下一篇写伪焦散效果