方法来源于Unity官方演示的2D教程,当时老师只提了一嘴,这个反射跟3D反射其实是一个做法,都是用摄像机渲染一个RT,然后映射到我们水的Sprite上,正好自己项目也需要这样的反射,就试着实现了一下,过程很简单,顺手也就写在知乎上记录一下。
先看个Gif吧
因为这里只是个引子,所以很多效果并没有实现,譬如水的的波光之类。
上面这张图可以看得比较清晰一点,画面中有两个摄像机,上面的是游戏的主摄像机,下面的就是我们用了渲染反射图用的摄像机,这里我是自己手动创建的,自己调整的大小,项目中最好还是代码来创建修改,然后又手动创建了一张RT指定到它的renderer target,
然后这张RT渲染出来就是这样的。
这个摄像机渲染的背景色为白色,因为最后叠加到水的shader上我用的乘法,如果你想用ADD叠加方式的话,这里背景就要改成黑色的了。
接下来就是水的shader了,我是拿unity内置的默认sprite改的。
主要代码在这里
//获取扭曲贴图,随着时间做UV偏移
float4 disTex = tex2D(_NoiseTex, float2(uv.x + _Time.x,uv.y));
//因为是2D平面的,所以只用了两个通道
float2 offsetUV = float2(disTex.r, disTex.g);
//图片的取值是0-1,但我们需要扩展到-1到1
offsetUV = (offsetUV - 0.5) * 2;
//利用这个扭曲的UV去采样RT图
fixed4 ref = tex2D(_RefTex, float2(uv.x, (1 - uv.y) ) + offsetUV * _NoisePower);
//最后把RT图乘到颜色里
color.rgb *= ref.rgb;
这里的扭曲方式我借鉴的李嘉的博客 原文在这里
Unity3D-Shader-热扭曲效果 - 李嘉的博客 - 博客园www.cnblogs.com整个工程我也打包到网盘上了,有需要的朋友可以看看,用的版本是2018.2.6,做的比较粗糙,希望可以抛砖引玉,联想出更多方式和效果。
链接:https://pan.baidu.com/s/1fIaPmaqnVbZwuzkc7xNYlQ
提取码:9bu9