廣告牌效果指的是,一個二維平面的法線方向始終與視線(錄影機的觀察方向)相同。廣泛運用于渲染煙霧,雲朵,閃光等。
它的本質在于建構旋轉矩陣,此時我們可以選擇三個基向量來建構此矩陣。
指向→的方向(X軸)
指向↑的方向(Y軸)
平面的法線方向(Z軸)
計算方法通常是:
1.根據目前錄影機的方向确定法線方向(廣告牌效果的本質),并歸一化
normal=normalize(viewDir);
2.根據得到的法線方向和初始的向上方向(在本地空間中即為float3(0,1,0))計算向右的方向,并歸一化
right=normalize(cross(up,normal));(使用向量的叉乘計算)
3.用計算後的向右方向和法線方向重新校正向上的方向,得到精确值
up'=normalize(cross(right,normal));
計算出旋轉矩陣後對原始的頂點進行各自方向上的偏移
腳本如下:
1 // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
2
3 Shader "MyUnlit/Billboarding"
4 {
5 Properties
6 {
7 _MainTex ("Texture", 2D) = "white" {}
8 _Color("Color Tint",color)=(1,1,1,1)
9 }
10 SubShader
11 {
12 //對頂點進行變換需禁用合P
13 Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true" "DisableBatching" = "True" }
14
15 Pass
16 {
17 //透明度混合
18 Tags{ "lightmode" = "forwardbase" }
19 ZWrite off
20 Blend SrcAlpha OneMinusSrcAlpha
21 Cull off
22
23 CGPROGRAM
24 #pragma vertex vert
25 #pragma fragment frag
26 #pragma multi_compile_fog
27
28 #include "UnityCG.cginc"
29
30 struct appdata
31 {
32 float4 vertex : POSITION;
33 float2 uv : TEXCOORD0;
34 };
35
36 struct v2f
37 {
38 float2 uv : TEXCOORD0;
39 UNITY_FOG_COORDS(1)
40 float4 vertex : SV_POSITION;
41 };
42
43 sampler2D _MainTex;
44 float4 _MainTex_ST;
45 fixed4 _Color;
46
47 v2f vert (appdata v)
48 {
49 v2f o;
50 //計算模型空間中的視線方向
51 float3 objViewDir = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
52
53 //計算旋轉矩陣的各個基向量
54 float3 normalDir =normalize(objViewDir);
55 float3 upDir =float3(0, 1, 0);
56 float3 rightDir = normalize(cross(normalDir, upDir));
57 upDir = normalize(cross(normalDir, rightDir));
58
59 //用旋轉矩陣對頂點進行偏移
60 float3 localPos =rightDir * v.vertex.x + upDir * v.vertex.y + normalDir * v.vertex.z;
61
62 //将偏移之後的值作為新的頂點傳遞計算
63 o.vertex = UnityObjectToClipPos(float4(localPos,1));
64 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
65 UNITY_TRANSFER_FOG(o,o.vertex);
66 return o;
67 }
68
69 fixed4 frag (v2f i) : SV_Target
70 {
71 fixed4 col = tex2D(_MainTex, i.uv);
72 col.rgb *= _Color.rgb;
73 UNITY_APPLY_FOG(i.fogCoord, col);
74 return col;
75 }
76 ENDCG
77 }
78 }
79 fallback "Transparent/VertexLit"
80 }
複制