廣告牌效果指的是,一個二維平面的法線方向始終與視線(攝像機的觀察方向)相同。普遍運用於渲染煙霧,雲朵,閃光等。app
它的本質在於構建旋轉矩陣,此時咱們能夠選擇三個基向量來構建此矩陣。spa
指向→的方向(X軸)code
指向↑的方向(Y軸)orm
平面的法線方向(Z軸)htm
計算方法一般是:blog
1.根據當前攝像機的方向肯定法線方向(廣告牌效果的本質),並歸一化ip
normal=normalize(viewDir);get
2.根據獲得的法線方向和初始的向上方向(在本地空間中即爲float3(0,1,0))計算向右的方向,並歸一化it
right=normalize(cross(up,normal));(使用向量的叉乘計算)class
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 }