Unity Shader 廣告牌效果

廣告牌效果指的是,一個二維平面的法線方向始終與視線(攝像機的觀察方向)相同。普遍運用於渲染煙霧,雲朵,閃光等。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 }
相關文章
相關標籤/搜索