企业级游戏开发笔记,URP卡通水体复盘

懒得去找合适点的法线纹理和噪声图,效果比较简陋,这里主要是复盘一下实现过程。
VS部分:
噪声扰动
模拟水波纹效果,要对UV进行一个偏移,同时给顶点加上适当的偏移让水面不那么平增加一点真实感
这里用一个vector4来表示相关的UV缩放,流速,以及扰动强度等等
然后混合扰动1和扰动2在法线图上取值,根据取得的结果偏移顶点
光照部分由bilingphong+fresnel+lambert组成,这里不多讲。
主要说一下深度图应用部分,为了模拟海水随深度颜色变深,以及漂浮物周围的泡沫,我们需要获取到深度图。一般来说要把tag设置成transparent来避免水体被写入深度图。获取深度图前需要保证URP设置中打开了Depth texture和Opque texture或者在相机中设置也可以,这里提一嘴unity2021.3.1.6f1c1不知道为什么深度图的设置有点问题怎么都获取不了,切换版本之后就正常了。
这里有个坑,齐次裁切必须要frag里面才可以,否则的话深度图的获取也会有问题。区别如下,具体原因也不知道为什么。


然后我们可以通过_CameraDepthTexutrue获取深度图,添加
可以省略_CameraDepthTexture和sampler_CameraDepthTexture的声明。
这个获取到的值就是不透明物体的深度,此时我们的水面深度可以用屏幕坐标的w分量获取

一张生动的示意图来表示,Depth-Scrpos就是此时视线所看的点的深度,根据这个深度我们插值返回浅水颜色和深水颜色即可。

物体的边缘,也就是深度比较浅的地方就应该出现泡沫效果,那么我们把深度比(深度/最大深度)和泡沫噪声图的采样作对比,噪声图大直接返回泡沫颜色,反之返回之前的到水体颜色。
差不多就这样,有空搞一个shader graph还原。
卖家秀,代码来源Samlee2023
