ユニティシェーダ看板効果

看板の効果は、二次元平面の法線方向は常に(カメラの方向を見る)視力の同じ行であることを意味します。広く煙、雲、フラッシュなどをレンダリングする際に使用されます。

その本質は、その後、我々はこの行列の3つの基底ベクトルを構築するために選択することができ、回転行列を構築することです。

方向(X軸)が導かれます→

方向(Y軸)が導かれます↑

面法線方向(Z軸)

これは、一般的に計算されます。

1.カメラの電流方向に応じて法線方向(看板効果の性質)を決定し、そして正規化

正常=正規化(VIEWDIR)。

2.得られた正規化(ローカル空間にするfloat3(0,1,0)である)初期上向き方向に応じて右方向及び法線方向を計算します

(ベクトル外積を用いて算出);右=正規化(アップクロス(、)正常)

3.上方向の正確な値を再較正右方向及び法線方向を算出した後

アップ '=ノーマライズ(クロス(右、正常))。

 

回転行列を算出した後、それぞれの元の頂点の方向にオフセット

 

次のようにスクリプトは次のとおりです。

1  // 注アップグレード:置換'を_World2Object 'unity_WorldToObject'と
2  
3シェーダ" MyUnlit /ビルボーディング" 
4  {
 5つの     プロパティ
 6      {
 7          _MainTex(" テクスチャ"、2D)= " " {}
 8          _Color(" 色味"、色)=(1111 9      }
 10      SubShader
 11      {
12個の         // 頂点が無効係合P変換でなければならない
13は          {タグ" キュー" = " 透明"  " RenderType " = " 透明"  " IgnoreProjector " = " 真の"  " DisableBatching " = " " }
 14の 
15          パス
 16          {
 17              / / アルファブレンディング
18は、              タグ{ LightMode = "forwardbase " }
 19              オフZWRITE
 20              ブレンドSRCALPHA OneMinusSrcAlpha
 21              カルオフ
 22  
23              CGPROGRAM
 24              の#pragma頂点VERT
 25              の#pragma断片FRAG
 26              の#pragmaは multi_compile_fog
 27  
28              の#include " UnityCG.cginc " 
29  
30              構造体APPDATA
 31              {
 32                  POSITION:のfloat4頂点;
 33                  するfloat2 UV:TEXCOORD0。
34である             };
 35  
36              構造体V2F
 37 [              {
 38は                 するfloat2 UV:TEXCOORD0;
 39                  UNITY_FOG_COORDS(1 40                  のfloat4頂点:SV_POSITION;
 41である             };
 42である 
43れる             sampler2D _MainTexは、
 44である             ;のfloat4 _MainTex_ST
 45              fixed4 _Color;
 46である 
47              V2Fヴェール(のAppData V)
 48              {
 49                  V2F O;
 50                  // モデル空間計算視線方向
51を                 MUL = objViewDirするfloat3(unity_WorldToObject、のfloat4(_WorldSpaceCameraPos、1。 ));
 52は、 
53である                 // 回転行列算出それぞれの基底ベクトル
54れる                  するfloat3 normalDir = ;正規化(objViewDir)
 55                  するfloat3 upDirするfloat3 =(010 );
 56であり                  するfloat3を= rightDir 正規化(クロス(normalDir、upDir));
 57である                  upDirは= ノーマライズ(クロス(normalDir、rightDirを));
 58  
59                  // オフセット頂点の回転行列
60                 * = rightDir v.vertex.x localPosするfloat3 + + normalDir v.vertex.y upDir * 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                  リターン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                  リターンCOL。
75              }
 76              ENDCG
 77          }
 78      }
 79      フォールバック" 透明/ VertexLit " 
80 }

 

おすすめ

転載: www.cnblogs.com/koshio0219/p/11125577.html