在unity的UPR中实现卡通水体渲染效果。
效果图
效果需求
制作该水体渲染时,为达成效果主要需要制作三个部分:
- 水体深浅变化
- 泡沫(白色海浪)往岸边推进
- 水底折射、扰乱
有了以上三点可以做成一个简单的水体效果。下面开始逐步进行制作。
水体深浅变化
水体深浅变化的过程由深度纹理来实现。通过顶点在屏幕空间中的位置与深度值来计算水深。
最重要的一步:
1 | float depthDifference = existingDepthLinear - i.screenPosition.w; |
得出结果:
再利用lerp
来进行颜色的渐变。
1 | float4 depthColor = lerp(_DepthGradientShallow,_DepthGradientDeep,dep_norm); |
最后效果:
水底扭曲效果
由于做的是非真实感绘制,也不需要多逼真的折射效果,就做一般的扭曲效果就行了。
扭曲效果制作非常简单,本质上是偏移UV,以产生扭曲的结果。因此需要输入一张噪声图。
在Unity的Build-in渲染管线下可以在合适的时机使用GrabPass截图,但是在URP管线下没有GrabPass了,想要获取截图只有_CameraColorTexture
和_CameraOpaqueTexture
对象渲染完毕后的画面生成在URP可以通过管线设置文件勾选Opaque Texture
实现,然后便可在Shader声明_CameraColorTexture
调用。_CameraOpaqueTexture
是在不透明通道渲染后截图,所以截不到半透明的物体,_CameraColorTexture
是在半透明通道渲染后和PostProcessing后截图。
海浪
原理暂时搁置,等有空补充。
【2022.3.23补充】海浪部分中,关于海浪的推进方向,我之前想到的是通过切线方向或者手动输入参数来控制海浪方向。但是经今天的启发,意识到可以利用之前得到的深度信息,将每个点的深度信息看作一个sin函数的相位差。再加上一个时间参数,就可以不用手动控制也能得到海浪向岸边推进的效果。
同时也不需要函数或是texture来控制海浪的长条形状,只需要一个噪声texture。
由于在毕设和找工作中没什么时间实现该点,等有空进行一个海浪部分的重新制作。