// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Book/11.Billboard"
{
//折射
Properties
{
_MainTex("Main Tex",2D)="white"{}
_Color("Color Tint",Color)=(1,1,1,1)
_VerticalBillboarding("Vertical Restraints",Range(0,1))=1
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True" "DisableBatching"="True"}
//Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True"}
Pass
{
Tags { "LightMode"="ForwardBase" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
//Cull Front
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
//#pragma multi_compile_fog
#include "UnityCG.cginc"
float4 _Color;
sampler2D _MainTex;
float _VerticalBillboarding;
float4 _MainTex_ST;
struct a2v
{
float4 vertex : POSITION;
float3 normal: NORMAL;
float4 tangent:TANGENT;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
float3 lightDir:TEXCOORD1;
float3 viewDir:TEXCOORD2;
float3 worldNormal:TEXCOORD3;
float3 worldPos:TEXCOORD4;
float3 worldRefr:TEXCOORD5;
};
v2f vert (a2v v)
{
v2f o;
float3 center = float3(0,0,0);
float3 viewer = mul(unity_WorldToObject,float4(_WorldSpaceCameraPos,1));
float3 normalDir =viewer-center;
normalDir.y=normalDir.y*_VerticalBillboarding;
normalDir = normalize(normalDir);
float3 upDir = abs(normalDir.y)>0.999?float3(0,0,1): float3(0,1,0);
float3 rightDir=normalize(cross(upDir,normalDir));
upDir = normalize(cross(normalDir,rightDir));
float3 centerOffs = v.vertex.xyz - center;
float3 localPos = center+ rightDir*centerOffs.x+upDir*centerOffs.y+normalDir*centerOffs.z;
//o.pos = mul(UNITY_MATRIX_MVP,float4(localPos,1));
o.pos = UnityObjectToClipPos(float4(localPos, 1));
o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = tex2D(_MainTex,i.uv.xy);;
c.rgb*=_Color.rgb;
return c;
}
ENDCG
}
}
FallBack "Transparent/VertexLit"
}