unity shader 倒影实现

Shader "test/1111" {
    Properties {
        _Diff ("Diff", 2D) = "white" {}

		 _FloorPos("FloorPos",Vector) = (0,0,0,0)
		 _RefPlan("RefPlane",Vector) = (0,-1,0,0)
		 _Offset("Offset",float) = 0
		 _Radius("Radius",float) = 0.8
    }
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct VertexInput {
                float4 vertex : POSITION;
				float4 color : COLOR;
				float2 texcord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : POSITION;
				float4 color : COLOR;
				float2 texcord0 : TEXCOORD0;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				o.color = v.color;
				o.texcord0 = v.texcord0;
                return o; 
            }
			uniform sampler2D _Diff; 
            fixed4 frag(VertexOutput i) : COLOR {
				return tex2D(_Diff, i.texcord0);
            }
            ENDCG
        }
		Pass { //这是倒影pass
			Tags { "QUEUE"="Overlay" "RenderType"="Transparent" }
			cull front
			//ZTest Off
			//ZWrite On
			Fog { Mode Off }
			Blend Srcalpha oneminussrcalpha
			CGPROGRAM
  			#pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct v2f { 
                float4 pos : SV_POSITION;
                half3 texcord0 : TEXCOORD0;
                half texcord1 : TEXCOORD1;
            };
			uniform half _Offset;
			uniform fixed4 _RefPlan;
			uniform half _Radius;
			uniform half4 _FloorPos;
            v2f vert(appdata_tan v)
            {
            	v2f o;
				float4 vt;
				vt = mul(_Object2World , v.vertex);//-fixed4(0,0,_Offset,0));
				vt -=_FloorPos;
				float3 vt2 = vt;
				vt.xyz = reflect(vt2.xyz,normalize(_RefPlan.xyz));
				vt.xyz += _FloorPos;
				vt = mul(UNITY_MATRIX_VP,vt);
				o.pos = vt;
				half dis2Plan = vt2.x * _RefPlan.x + vt2.y * _RefPlan.y + vt2.z * _RefPlan.z;
				half yf = -dis2Plan;
				vt2.y = 0;
				o.texcord1 = min(_Radius - length(vt2), yf);
				o.texcord0 = v.texcoord;
				return o;
            }
			uniform sampler2D _Diff; 
            float4 frag(v2f inData) : COLOR
            {
				clip(_Offset);
				clip(inData.texcord1);
				fixed4 col = tex2D(_Diff, inData.texcord0)*0.5;
				return col ;
            }

			ENDCG
		}
    }
    FallBack "Diffuse"
}

unity shader 倒影实现

上一篇:程序语言词汇外语收藏


下一篇:100-days: Four