Shader 学习笔记(15) Glass毛玻璃效果

用到了一个新的PASS:GrabPass.效果图如下:


因为是先截取屏幕后,进行一个混合运算,黄色方块虽然在plane的前方,但还是会有扭曲的效果.如果要实现清澈河流的效果.可能还是用Render Texture 更加的合适.也更节省性能.

切线空间转换这里现在还不是很懂.当前只是把代码扒下来.有空回头再看几遍空间转换.

Shader"wx/Glass"{
	Properties{
		_MainTex("Main Tex",2D)="white"{}
		_BumpMap("Normal Map",2D)="bump"{}
		_CubeMap("Environment Cubemap",Cube)="_Skybox"{}
		_Distortion("Distortion",Range(0,100))=10
		_RefractAmount("Refract Amount",Range(0,1.0))=1.0
	}
	SubShader{
		Tags{"Queue"="Transparent" "RenderType"="Opaque"}
		
		GrabPass{"_RefractionTex"}
		Pass{
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"

		sampler2D  _MainTex;
		float4 _MainTex_ST;
		sampler2D _BumpMap;
		float4 _BumpMap_ST;
		samplerCUBE _Cubemap;
		float _Distortion;
		fixed _RefractAmount;
		sampler2D _RefractionTex;
		float4 _RefractionTex_TexelSize;
		struct a2v
		{
			float4 vertex:POSITION;
			float3 normal:NORMAL;
			float4 texcoord:TEXCOORD0;
			float4 tangent:TANGENT;
		};
		struct v2f
		 {
		 	float4 pos:SV_POSITION;
		 	float4 scrPos:TEXCOORD0;
		 	float4 uv:TEXCOORD1;
		 	float4 TtoW0:TEXCOORD2;
		 	float4 TtoW1:TEXCOORD3;
		 	float4 TtoW2:TEXCOORD4;
		 }; 
		 v2f vert(a2v v){
		 	v2f o;
		 	o.pos=UnityObjectToClipPos(v.vertex);
		 	o.scrPos=ComputeGrabScreenPos(o.pos);
		 	o.uv.xy=TRANSFORM_TEX(v.texcoord,_MainTex);
		 	o.uv.zw=TRANSFORM_TEX(v.texcoord,_BumpMap);
		 	float3 worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;
		 	fixed3 worldNormal=UnityObjectToWorldNormal(v.normal);
		 	fixed3 worldTangent=UnityObjectToWorldDir(v.tangent.xyz);
		 	fixed3 worldBinormal=cross(worldNormal,worldTangent)*v.tangent.w;
		 	o.TtoW0=float4(worldTangent.x,worldBinormal.x,worldNormal.x,worldPos.x);
		 	o.TtoW1=float4(worldTangent.y,worldBinormal.y,worldNormal.y,worldPos.y);
		 	o.TtoW2=float4(worldTangent.z,worldBinormal.z,worldNormal.z,worldPos.z);
		 	return o;
		 }
		 fixed4 frag(v2f i):SV_Target{
		 	float3 worldPos=float3(i.TtoW0.x,i.TtoW1.x,i.TtoW2.x);
		 	fixed3 worldViewDir=normalize(UnityWorldSpaceViewDir(worldPos));
		 	fixed3 bump=UnpackNormal(tex2D(_BumpMap,i.uv.zw));
		 	float2 offset=bump.xy*_Distortion*_RefractionTex_TexelSize.xy;
		 	i.scrPos.xy=offset+i.scrPos.xy;
		 	fixed3 refrCol=tex2D(_RefractionTex,i.scrPos.xy/i.scrPos.w).rgb;
		 	bump=normalize(half3(dot(i.TtoW0.xyz,bump),dot(i.TtoW1.xyz,bump),dot(i.TtoW2.xyz,bump)));
		 	fixed3 reflDir=reflect(-worldViewDir,bump);
		 	fixed4 texColor=tex2D(_MainTex,i.uv.xy);
		 	fixed3 reflCol=texCUBE(_Cubemap,reflDir).rgb*texColor.rgb;
		 	fixed3 finalColor=reflCol*(1-_RefractAmount)+refrCol*_RefractAmount;
		 	return fixed4(finalColor,1);

		 }
		  ENDCG
		}
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_26365139/article/details/80097293