// 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
最新推荐文章于 2024-01-07 17:06:55 发布