Unity Shader 广告牌效果

时间:2023-03-10 03:12:53
Unity Shader 广告牌效果

广告牌效果指的是,一个二维平面的法线方向始终与视线(摄像机的观察方向)相同。广泛运用于渲染烟雾,云朵,闪光等。

它的本质在于构建旋转矩阵,此时我们可以选择三个基向量来构建此矩阵。

指向→的方向(X轴)

指向↑的方向(Y轴)

平面的法线方向(Z轴)

计算方法通常是:

1.根据当前摄像机的方向确定法线方向(广告牌效果的本质),并归一化

normal=normalize(viewDir);

2.根据得到的法线方向和初始的向上方向(在本地空间中即为float3(0,1,0))计算向右的方向,并归一化

right=normalize(cross(up,normal));(使用向量的叉乘计算)

3.用计算后的向右方向和法线方向重新校正向上的方向,得到精确值

up'=normalize(cross(right,normal));

计算出旋转矩阵后对原始的顶点进行各自方向上的偏移

脚本如下:

 // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

 Shader "MyUnlit/Billboarding"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color("Color Tint",color)=(,,,)
}
SubShader
{
//对顶点进行变换需禁用合P
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true" "DisableBatching" = "True" } Pass
{
//透明度混合
Tags{ "lightmode" = "forwardbase" }
ZWrite off
Blend SrcAlpha OneMinusSrcAlpha
Cull off CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS()
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color; v2f vert (appdata v)
{
v2f o;
//计算模型空间中的视线方向
float3 objViewDir = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, )); //计算旋转矩阵的各个基向量
float3 normalDir =normalize(objViewDir);
float3 upDir =float3(, , );
float3 rightDir = normalize(cross(normalDir, upDir));
upDir = normalize(cross(normalDir, rightDir)); //用旋转矩阵对顶点进行偏移
float3 localPos =rightDir * v.vertex.x + upDir * v.vertex.y + normalDir * v.vertex.z; //将偏移之后的值作为新的顶点传递计算
o.vertex = UnityObjectToClipPos(float4(localPos,));
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
col.rgb *= _Color.rgb;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
fallback "Transparent/VertexLit"
}