unity urp 实现雨水在物体上流动的效果_unity


如何实现原理还是很简单的,还是使用简单的uv偏移实现即可。

首先,我们需要一张雨滴流向的贴图,和法向贴图。

unity urp 实现雨水在物体上流动的效果_游戏引擎_02


配套的法向贴图,让雨水的效果更加明显

unity urp 实现雨水在物体上流动的效果_实现原理_03


在这里,我还加上了对贴图的旋转,ase里面节点叫rotator,直接把节点的代码拷贝出来的。然后为了保证密度,还加上的tillingoffset

float cos23 = cos(_RainRotate * PI);
float sin23 = sin(_RainRotate * PI);
float2 rotator = mul(UV - _RainAnchor, float2x2(cos23, -sin23, sin23, cos23)) + _RainAnchor;
rotator = rotator * _RainMask_ST.xy + _RainMask_ST.zw;
half rain = SAMPLE_TEXTURE2D(_RainMask, sampler_RainMask, rotator).r;

获取雨的代码就是这样的。

得出来的结果就是:

unity urp 实现雨水在物体上流动的效果_实现原理_04


然后我们可以把法线加上,增加渐变过渡,这个我在这里就不加了。它的路线有了,那么我们怎么让雨水流动起来呢。

unity urp 实现雨水在物体上流动的效果_游戏引擎_05


这是一张渐变图。我使用time让其偏移起来

half2 rainMaskUV = rotator + _TimeParameters.x * _RainDir * _RainSpeed * 0.1;
half rainMask = SAMPLE_TEXTURE2D(_RainMask, sampler_RainMask, rainMaskUV).g;
rainMask = saturate(pow(rainMask, 8));

然后增强一下对比度,效果是这样的

unity urp 实现雨水在物体上流动的效果_unity_06


它们就动了起来,然后我们把它们一合并,这就完成了,动起来了。

rainMask = saturate(rain - rainMask);

unity urp 实现雨水在物体上流动的效果_unity