廣告牌效果指的是,一個二維平面的法線方向始終與視線(攝像機的觀察方向)相同。廣泛運用於渲染煙霧,雲朵,閃光等。
它的本質在於構建旋轉矩陣,此時我們可以選擇三個基向量來構建此矩陣。
指向→的方向(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 }