之路——玻璃效果"/>
shader学习之路——玻璃效果
// 通过凹凸贴图实现扭曲效果 使用凹凸贴图来表示扭曲方向Shader "Unlit/Grass"
{Properties{_MainTex("Base(RGB) Trans(A)",2D) = "white"{}_Color("Color",Color) = (1,1,1,1)_BumpMap("Noise text",2D) = "Bump"{} // 表示xyz偏移值_Magnitede("Magnitude",Range(0,1)) = 0.05 //扭曲幅度}SubShader{Tags { "Queue" = "Transparent" //渲染队列里面的顺序 透明队列"IgnoreProjector" = "True" //忽略阴影"RenderType"="Opaque" }ZWrite OnLighting OffCull OffFog{Mode Off}Blend One ZeroGrabPass{"_GrabTexture"} //在对玻璃第一遍渲染时,把整个场景拍照,绘制到一个名为_GrabTexture的纹理上 Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag #include "UnityCG.cginc" sampler2D _GrabTexture; //存储GrabPass中抓取的纹理sampler2D _MainTex;fixed4 _Color;sampler2D _BumpMap;float _Magnitede;struct appdata{float4 vertex : POSITION; float4 color:COLOR;float2 texcoord:TEXCOORD0;};struct v2f{float4 vertex : POSITION;float4 grab_uv : TEXCOORD1; float4 color:COLOR;float2 texcoord:TEXCOORD2;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex); //从模型空间到摄像机空间o.color = v.color;o.texcoord = v.texcoord;//ComputeGrabScreenPos 传入一个投影空间中的顶点坐标,//此方法会以摄像机可视范围的左下角纹理坐标为[0,0]点,以右上角为[1,1]点,计算出当前顶点对应的纹理o.grab_uv = ComputeGrabScreenPos(o.vertex);return o;}//ComputeGrabScreenPos和tex2Dproj 经过这两个方法可以把摄像机空间的点对应到屏幕空间贴图的坐标half4 frag (v2f i) : COLOR{half4 mainColor = tex2D(_MainTex,i.texcoord);half4 Bump = tex2D(_BumpMap,i.texcoord);half2 distortion = UnpackNormal(Bump).rg; //把纹理坐标转换为法线坐标 [0-1]区间i.grab_uv.xy += distortion * _Magnitede;fixed4 col = tex2Dproj(_GrabTexture,UNITY_PROJ_COORD(i.grab_uv));return col * mainColor * _Color;}ENDCG}}
}
更多推荐
shader学习之路——玻璃效果
发布评论