unity 2d摄像机类型_Unity Shader 基于Sprite的2D水的反射

v2-ef0724cd4dc035e5ca1ed9bb47a60a12_1440w.jpg?source=172ae18b

方法来源于Unity官方演示的2D教程,当时老师只提了一嘴,这个反射跟3D反射其实是一个做法,都是用摄像机渲染一个RT,然后映射到我们水的Sprite上,正好自己项目也需要这样的反射,就试着实现了一下,过程很简单,顺手也就写在知乎上记录一下。

先看个Gif吧

v2-43181ba6c930033399e5eae8458cde86_b.gif

因为这里只是个引子,所以很多效果并没有实现,譬如水的的波光之类。

v2-8f2ae62571dceaf43ba2b989ac2d0793_b.jpg

上面这张图可以看得比较清晰一点,画面中有两个摄像机,上面的是游戏的主摄像机,下面的就是我们用了渲染反射图用的摄像机,这里我是自己手动创建的,自己调整的大小,项目中最好还是代码来创建修改,然后又手动创建了一张RT指定到它的renderer target,

v2-e8f531801bb46c4fe22d5d95167f5554_b.jpg

然后这张RT渲染出来就是这样的。

v2-42116ab2a6481b3f1b3df281014b707a_b.jpg

这个摄像机渲染的背景色为白色,因为最后叠加到水的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
v2-72d8ea16b8ba27fe42c7e7aec6545753_180x120.jpg

整个工程我也打包到网盘上了,有需要的朋友可以看看,用的版本是2018.2.6,做的比较粗糙,希望可以抛砖引玉,联想出更多方式和效果。

链接:https://pan.baidu.com/s/1fIaPmaqnVbZwuzkc7xNYlQ

提取码:9bu9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值