// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Achonor/Billboard"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_RowAmount ("Row Amount", Float) = 4
_ColumnAmount ("Column Amount", Float) = 4
_AnimSpeed ("Anim Speed", Range(10, 100)) = 30
}
SubShader
{
Tags {
"Queue" = "Transparent"
"RenderType"="Transparent"
"IgnoreProjector" = "True"
}
Pass
{
Cull Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct a2v
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _RowAmount;
float _ColumnAmount;
float _AnimSpeed;
v2f vert (a2v v)
{
v2f o;
float3 center = float3(0, 0, 0);
//模型空間下的攝像機座標
float4 cameraObjPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1));
//新的法線
fixed3 objNormal = normalize(cameraObjPos.xyz - center);
//防止法線和y模型空間Y軸重疊
fixed3 upDir = 0.999 < objNormal.y ? fixed3(0, 0, 1) : fixed3(0, 1, 0);
//新模型空間的X軸
fixed3 rightDir = normalize(cross(objNormal, upDir));
//新模型空間的Y軸
upDir = normalize(cross(objNormal, rightDir));
// 新模型空間到原模型空間的轉換矩陣的轉置矩陣
fixed3x3 toObjMatrix = {
rightDir,
upDir,
objNormal
};
//新模型空間下的點在原模型空間的位置 因爲是轉置矩陣 所以要左乘
float3 newVertex = center + mul(v.vertex, toObjMatrix);
o.pos = UnityObjectToClipPos(newVertex);
float time = floor(_AnimSpeed * _Time.y);
float row = floor(time / _ColumnAmount);
float column = time - _ColumnAmount * row;
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.x = o.uv.x / _ColumnAmount;
o.uv.y = o.uv.y / _RowAmount;
o.uv.x += (column / _ColumnAmount);
o.uv.y += (1 - row / _RowAmount);
return o;
}
fixed4 frag (v2f o) : SV_Target
{
return tex2D(_MainTex, o.uv.xy).rgba;
}
ENDCG
}
}
}
UnityShader 總是朝着攝像機的幀動畫 Billboard
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.