Unity Shader 廣告牌效果


廣告牌效果指的是,一個二維平面的法線方向始終與視線(攝像機的觀察方向)相同。廣泛運用於渲染煙霧,雲朵,閃光等。

它的本質在於構建旋轉矩陣,此時我們可以選擇三個基向量來構建此矩陣。

指向→的方向(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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM