Shader "_MyShader/8_Animation/3_Billboard"
{
Properties
{
_MainTex ("MainTex", 2D) = "white" {}
_Color ("Color", COLOR) = (1,1,1,1)
_VerticalBillboarding ("VerticalRestraints", Range(0,1)) = 1
}
SubShader
{
Tags { "Queue"="Transparent" "RendererType"="Transparent" "IgnoreProject"="True" "DisableBatching"="True" }
Pass
{
Tags { "LightMode"="ForwardBase" }
ZWrite off
Cull off
blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct a2v
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _VerticalBillboarding;
fixed4 _Color;
v2f vert (a2v v)
{
v2f o;
float3 origin = float3(0,0,0);
float3 viewer = mul(_World2Object,float4(_WorldSpaceCameraPos,1));
float3 normalDir = viewer - origin;
normalDir.y *= _VerticalBillboarding;
normalDir = normalize(normalDir);
float3 upDir = abs(normalDir.y)>0.99 ? float3(0,0,1) : float3(0,1,0);
float3 rightDir = normalize(cross(upDir,normalDir));
upDir = normalize(cross(normalDir,rightDir));
float3 originOffs = v.vertex.xyz - origin;
float3 localPos = origin + rightDir * originOffs.x + upDir * originOffs.y + normalDir * originOffs.z;
o.vertex = mul(UNITY_MATRIX_MVP, float4(localPos,1));
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col * _Color;
}
ENDCG
}
}
FallBack "Transparent/VertexLit"
}
UnityShader 学习笔记 20 广告牌
最新推荐文章于 2023-05-28 18:58:12 发布