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