Unity中使用Shader制作雨中的玻璃窗学习笔记
https://www.youtube.com/watch?v=EBrAdahFtuo 观看油管大神的教程后的笔记。
使背景变得模糊,模拟雾气
- 纹理的Inspector面板中,勾选Generate Mip Maps,会生成八个MipMaps,具有不同的细节度。
- tex2Dlod(_MainTex,float4(x,y,z,w));该纹理采样函数中,除了uv以外,还可以控制细节等级,和偏移 ,w控制细节。
- 纹理的Inspector面板中的Filter Mode,表示当纹理被三维变换拉伸时如何被过滤。其中有三个选项:Point无过滤器,Bilinear当近距离看时变模糊,Trilinear 比Bilinear多一条在不同的Mip Level之间也模糊。就是模糊的等级更多了,有无级变速的感觉。
使玻璃变得透明
- 在SubShader中添加GrabPass{"_GrabTexture"},意为截屏,存储起来使用。有两个问题:1、和后方的背景衔接不正确 2、无法显示后方的游戏对象,原因为unity默认为靠近摄像机的先渲染。
- 问题1:在V2F结构中添加变量float4 grabUv : TEXCOORD1;,在顶点着色器中添加语句o.grabUv = UNITY_PROJ_COORD(ComputeGrabScreenPos(o.vertex));
float4 UNITY_PROJ_COORD( float4 )输入一个四分量的向量,返回适合纹理采样的坐标。
float4 ComputeGrabScreenPos( float4 )输入剪辑空间的坐标,返回用于GrabPass的坐标。
问题2:在SubShader的Tag中添加"Queue"=“Transparent”,告诉Unity这个对象是透明的,需要在最后渲染。
手写模糊算法
- 由于使用GrabPass得到的纹理无法使用Mipmap,通过对每一像素和周围像素迭代求平均值,实现模糊,这是最简单的模糊方法,但是代价高昂。
//blur为模糊的程度以及水滴划过的地方没有雾气的遮罩
float blur = _Blur * 7 * (1-drops.z);
float2 projUv = i.grabUv.xy/i.grabUv.w;
projUv+=drops