【Unity3D】廣告牌特效
1 前言
? 廣告牌特效是指:空間中的一個 2D 對象始終(或盡可能)面向相機,使得用戶能夠盡可能看清楚該 2D 物體。廣告牌特效一共有以下 3 種:
正視廣告牌:廣告牌始終以正視圖姿態(tài)面向相機,即廣告牌的 x、y、z 軸正方向始終指向相機的 x、y、z 軸正方向; 血條廣告牌:游戲中的血條效果廣告牌,廣告牌可以繞世界坐標系的 y 軸旋轉(zhuǎn),使其盡可能面向相機,即廣告牌的 x 軸正方向始終指向相機的 x 軸正方向,y 軸正方向始終指向 (0, 1, 0) 方向,z 軸正方向可以隨相機位置和姿態(tài)變動; 測距廣告牌:測距時顯示距離效果的廣告牌,廣告牌可以繞局部坐標系的 x 軸旋轉(zhuǎn),使其盡可能面向相機,即廣告牌的 x 軸正方向固定不變,y、z 軸正方向可以隨相機位置和姿態(tài)變動。? 本文完整資源見→Unity3D廣告牌特效。
2 正視廣告牌
? 正視廣告牌是指:廣告牌始終以正視圖姿態(tài)面向相機,即廣告牌的 x、y、z 軸正方向始終指向相機的 x、y、z 軸正方向。
? FrontView.shader
Shader "MyShader/Billboard/FrontView" { // 正視廣告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材質(zhì)紋理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材質(zhì)顏色 } SubShader{ // 批處理會合并所有相關(guān)的模型, 導致模型各自的模型空間丟失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材質(zhì)紋理 float4 _MainTex_ST; // 材質(zhì)紋理的縮放和偏移 fixed4 _Color; // 材質(zhì)顏色 struct a2v { float4 vertex : POSITION; // 模型空間頂點坐標 half2 texcoord : TEXCOORD0; // 頂點紋理坐標 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空間頂點坐標 half2 uv : TEXCOORD0; // 頂點紋理坐標 }; v2f vert(a2v v) { v2f o; float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐標系中模型中心坐標 float3 right = mul(unity_MatrixInvV, float4(1, 0, 0, 0)).xyz; // 世界坐標系中相機的right向量(廣告牌的x軸) float3 up = mul(unity_MatrixInvV, float4(0, 1, 0, 0)).xyz; // 世界坐標系中相機的up向量(廣告牌的y軸) float3 forward = mul(unity_MatrixInvV, float4(0, 0, 1, 0).xyz); // 世界坐標系中相機的forward向量(廣告牌的z軸) float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐標系中模型中心指向頂點的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐標系中頂點坐標經(jīng)過廣告牌變換后的坐標 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐標系中頂點坐標 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 紋理uv坐標 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit" }
? 運行效果:
3 血條廣告牌
? 血條廣告牌是指:游戲中的血條效果廣告牌,廣告牌可以繞世界坐標系的 y 軸旋轉(zhuǎn),使其盡可能面向相機,即廣告牌的 x 軸正方向始終指向相機的 x 軸正方向,y 軸正方向始終指向 (0, 1, 0) 方向,z 軸正方向可以隨相機位置和姿態(tài)變動。
? Lifebar.shader
Shader "MyShader/Billboard/Lifebar" { // 血條廣告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材質(zhì)紋理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材質(zhì)顏色 } SubShader{ // 批處理會合并所有相關(guān)的模型, 導致模型各自的模型空間丟失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材質(zhì)紋理 float4 _MainTex_ST; // 材質(zhì)紋理的縮放和偏移 fixed4 _Color; // 材質(zhì)顏色 struct a2v { float4 vertex : POSITION; // 模型空間頂點坐標 half2 texcoord : TEXCOORD0; // 頂點紋理坐標 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空間頂點坐標 half2 uv : TEXCOORD0; // 頂點紋理坐標 }; v2f vert(a2v v) { v2f o; float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐標系中模型中心坐標 float3 right = mul(unity_MatrixInvV, float4(1, 0, 0, 0)).xyz; // 世界坐標系中相機的right向量(廣告牌的x軸) float3 up = float3(0, 1, 0); // 廣告牌的y軸 float3 forward = cross(right, up); // 廣告牌的z軸 float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐標系中模型中心指向頂點的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐標系中頂點坐標經(jīng)過廣告牌變換后的坐標 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐標系中頂點坐標 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 紋理uv坐標 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit" }
? 運行效果:
4 測距廣告牌
? 測距廣告牌是指:測距時顯示距離效果的廣告牌,廣告牌可以繞局部坐標系的 x 軸旋轉(zhuǎn),使其盡可能面向相機,即廣告牌的 x 軸正方向固定不變,y、z 軸正方向可以隨相機位置和姿態(tài)變動。
? MeasureDist.shader
Shader "MyShader/Billboard/MeasureDist" { // 測距廣告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材質(zhì)紋理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材質(zhì)顏色 } SubShader{ // 批處理會合并所有相關(guān)的模型, 導致模型各自的模型空間丟失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材質(zhì)紋理 float4 _MainTex_ST; // 材質(zhì)紋理的縮放和偏移 fixed4 _Color; // 材質(zhì)顏色 struct a2v { float4 vertex : POSITION; // 模型空間頂點坐標 half2 texcoord : TEXCOORD0; // 頂點紋理坐標 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空間頂點坐標 half2 uv : TEXCOORD0; // 頂點紋理坐標 }; v2f vert(a2v v) { v2f o; float3 forwardDire = mul(unity_ObjectToWorld, float4(0, 0, 1, 0)).xyz; // 世界坐標系中模型的forward向量 float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐標系中模型中心坐標 float3 viewDire = normalize(center - _WorldSpaceCameraPos.xyz); // 觀察向量, 相機指向頂點 float3 right = normalize(mul(unity_ObjectToWorld, float4(1, 0, 0, 0)).xyz) * sign(dot(viewDire, forwardDire)); // 世界坐標系中模型的right向量(廣告牌的x軸) float3 up = cross(viewDire, right); // 廣告牌的y軸 float3 forward = cross(right, up); // 廣告牌的z軸 float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐標系中模型中心指向頂點的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐標系中頂點坐標經(jīng)過廣告牌變換后的坐標 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐標系中頂點坐標 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 紋理uv坐標 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit" }
? 運行效果:
? 聲明:本文轉(zhuǎn)自【Unity3D】廣告牌特效。
相關(guān)知識
平面廣告模特培訓
ASA封禁Saint Laurent Paris廣告 模特太廋不健康
廣東藥監(jiān)局:碧生源常潤茶廣告違法 夸大功效
光明暢優(yōu)酸奶品牌廣告文案活動策劃
碧生源牌減肥茶廣告語(熱門2篇)
[專題]光明暢優(yōu)酸奶品牌廣告文案.doc
廣告心理學閱讀
碧生源牌減肥茶廣告語經(jīng)典3篇
中國勁酒廣告
【廣告策劃
網(wǎng)址: 【Unity3D】廣告牌特效 http://m.u1s5d6.cn/newsview561607.html
推薦資訊
- 1發(fā)朋友圈對老公徹底失望的心情 12775
- 2BMI體重指數(shù)計算公式是什么 11235
- 3補腎吃什么 補腎最佳食物推薦 11199
- 4性生活姿勢有哪些 盤點夫妻性 10425
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7826