ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

ShaderLab入門  Tag・描画設定まとめ

ShaderLabのTagや描画設定について自分用にまとめました。

 

  説明
SubShaderの中でしか使えない
Queu(レンダーキュー) 通称
指定した値が小さいほど先に描画される
CustomRenderQueueが0以上の時はここで設定された値は無視される

2500までは手前のオブジェクトから描画され、
2501以降は奥のオブジェクトから描かれます。

例) 自然数と用意された定数を使用できる 
Tags { "Queue" = "1000" }
Tags { "Queue" = "Geometry" }  // 2000
Tags { "Queue" = "Geometry+1" } //2100

Unity描画順
手前から後方へ(後方のオブジェクトが深度テストで破棄されるため)
Background(1000) : 背景
Geometry(2000) : 不透明なオブジェクト
AlphaTest(2450) : アルファテストをする(透明)オブジェクト

後方から手前へ(手前に透明なオブジェクトがあると深度バッファに書き込まれていないので合成されてしまうため)
Transparent(3000) : ガラスなどアルファブレンディングしない(深度バッファに書き込みを行わない)オブジェクト
Overlay(4000) : レンズフレアなどオーバーレイ効果を行うオブジェクト
https://docs.unity3d.com/ja/2019.4/Manual/class-LensFlare.html
RenderType カメラのレンダリング対象のオブジェクトのシェーダーを切り替える

//指定したシェーダーに切り替える
_camera?.SetReplacementShader(Shader.Find("シェーダー名"), null);

// シェーダーのTagと引数Tagが一致しているなら指定したシェーダーに切り替わる
// 一致しているTagがない場合は描画されない
_camera?.SetReplacementShader(Shader.Find("シェーダー名"), "Tag名");


Unity側で用意されたシェーダーを使用することができる
例)
Tags { "RenderType" = "Opaque" }

詳しい解
Opaque: ほとんどのシェーダー(Normal、Self Illuminated、Reflective、Terrain シェーダー)。
Transparent: ほとんどの部分が透過なシェーダー(Transparent、パーティクル、フォント、Terrain 追加パスシェーダー)。 TransparentCutout: マスキングされた透過シェーダー(Transparent Cutout、2 パス植生シェーダー)。
Background: Skybox シェーダー。
Overlay: ハロー、フレアシェーダー。
TreeOpaque: Terrain エンジン Tree の樹皮。
TreeTransparentCutout:Terrain エンジン Tree 葉っぱ。
TreeBillboard: Terrain エンジンビルボードの 木。
Grass: Terrain エンジンの 草。
GrassBillboard: Terrain エンジンビルボードの草。
DisableBatching グラフィックスAPIを使用して、画面に描画を行う際に呼び出す命令の事を DrawCallといい、
複数のオブジェクトをまとめて一つのDeawCallで行うことをという。

ドローコールバッチング

ダイナミック(動的)バッチング
スタティック(静的)バッチング


バッチングされるとすべてのジオメトリがWorldSpaceに変換されるため、ModelSpaceでの座標系がShader内で利用できなくなります。
ModelSpaceしたい場合はバッチングを無効にする必要があります。
False : バッチングを有効 デフォルト
True : バッチングを無効
LODFading : LOD フェードがアクティブな時は、バッチングを無効にする
ForceNoShadowCasting キャストシャドウを強制的に禁止する際に使用します。
例)
Tags {"ForceNoShadowCasting" = "True"}
True : キャストシャドウを投影しない
False : キャストシャドウを投影する
IgnoreProjector Projectorコンポーネントの影響を受けないシェーダーを作成する際に使用します。
Projector コンポーネントは投影テクスチャマッピング(任意のテクスチャをプリミティブの表面に描写する。壁に弾痕を刻むような演出で使用する)を実行する機能です
Projectorコンポーネント

半透明オブジェクトの表面に投影されると意図しない結果になるので、このタグで強制的にオフにします。
例)
Tags {"IgnoreProjector" = "True"}
True : プロジェクターコンポーネントの影響を受けない
False: プロジェクターコンポーネントの影響を受ける
CanUseSpriteAtlas Sprite オブジェクト用に実装しているシェーダーの中で、テクスチャがアトラス化されている
場合には使用できないことを明示します。以下のようにタグを宣言すると有効になります。
True
False
PreviewType マテリアルインスペクタのPreview画面の3D形状
基本的に必要ない
Sphere : 球体(初期値)
Plane : 2D
Skybox : スカイボックス
LOD宣言    
LOD(シェーダーLOD) LODに設定した値以下で一番大きい閾値が設定されている SubShader が実行されます。

モデル単位 Shader.maximumLOD
全モデル  Shader.globalMaximumLOD
 
     
PASS宣言
Name Passに名前をつける

例)
Name "PassName"
全て大文字扱いになるのでPASSNAMEになっている
 
Taggs Passの役割を指定する  
LightMode Passがどのライトの影響下で実行されるかを指定します。
LightMode に応じて必要なデータを Passに渡します。

また、設定された LightMode によっては、同じPass が複数回実行されたり、Pass の実行が飛ばされたりもします。
SubShader 内に記述された複数のPass が、それぞれどのタイミングで実行されるかは、使用しているレンダリングパスと、設定されているLightMode の内容によって決まります。
例)
Tags { "LightMode" = "ForwardBase" }
フォワードレンダリング
Always 常にレンダリングされる。ライティングは適用されない。
ForwardBase メインのディレクショナルライト、頂点単位ライト、アンビエントライト、SH(球面調和)ライトを適用する。
ForwardAdd ピクセル単位ライトを適用する。ライトの数だけ Pass を実行する。
ShadowCaster オブジェクトの深度をシャドウマップや深度テクスチャに描画する。

ディファードレンダリング
Deferred レンダリングパス実行時に、G-Buffer をレンダリングするために使用
MotionVectors オブジェクトの動きベクトルを計算する為に使用
     
Stencil
ref リファレンス値 0-255
Comp ステンシルバッファとリファレンス値をどのように比較するか  Greater ピクセルのレファレンス値がバッファの値より大きい場合のみレンダリングします。
GEqual ピクセルのレファレンス値がバッファの値より大きいか等しい場合のみレンダリングします。
Less ピクセルのレファレンス値がバッファの値より小さい場合のみレンダリングします。
LEqual ピクセルのレファレンス値がバッファの値より小さいか等しい場合のみレンダリングします。
Equal ピクセルのレファレンス値がバッファの値と等しい場合のみレンダリングします。
NotEqual ピクセルのレファレンス値がバッファの値と等しくない場合のみレンダリングします。
Always 常にステンシルテストをパスさせます。
Never 常にステンシルテストを通しません。
Pass ステンシルテストをパスした場合、バッファの内容をどうするか決めます。
Keep バッファの現在コンテンツを保持します。
Zero バッファに 0 を書き込みます。
Replace リファレンス値をバッファに書き込みます。
IncrSat バッファの現在値をインクリメントさせます。値がすでに 255 の場合は 255 のままです。
DecrSat バッファの現在値をデクリメントさせます。値がすでに 0 の場合は 0 のままです。
Invert すべてのビットを反転させます。
IncrWrap バッファの現在値をインクリメントさせます。値がすでに 255 の場合は 0 にします。
DecrWrap バッファの現在値をデクリメントさせます。値がすでに 0 の場合は 255 にします。」
Fail ステンシルテストに失敗した時 例)
Stencil {
Ref 2 // リファレンス値
Comp Always // 常にステンシルテストをパスさせます。
Pass Replace // リファレンス値をバッファに書き込みます。
}
ZFail ステンシルテストは成功したが、深度テストに失敗した場合  
レンダリングステート 説明
ColorMask 出力するチャンネルを指定できる 0:描画しない
RGBA:全て描画
RとGとBとAの好きな組み合わせ
Cull カリングの設定 Off : カリングしない
Back : 背面をカリング
front : 正面をカリング
ZWrite [On | Off] 深度値を書き込むかどうか決める On : Zバッファを書き込む
Off : Zバッファに書き込まな
Ztest 深度テスト Less    深度バッファの値より小さい
Greater  深度バッファの値より大きい
LEqual   深度バッファの値より小さいか同じ(デフォルト)
GEqual  深度バッファの値より大きいか同じ
Equal   深度バッファの値と同一
NotEqual 深度バッファの値と不一致
Always 常に成立
Offset Zファイティングが発生しそうな際に片方のプリミティブのピクセルの深度を算出する際にオフセット値が加算される
例)Offset -1,-1
 
Blend Blend [SrcFactor] [DstFactor](ソースファクター)(デストファクター)

計算式
フラグメントシェーダーの出力値 * SrcFactor
+ フレームバッファの出力値 * DstFactor
 
AlphaToMask Alpha-to-coverage というアンチエイアリシング処理を有効にします。
これは MSAA(※1)では滑らかにならない,アルファテストで破棄された箇所の境界線を滑らかにします。草木のテクスチャのように、テクスチャが複雑に切り抜かれる物で効果を発揮します。
例)AlphaToMask On

SSAA:隣接するピクセルの平均色
MSAA:隣接するピクセルの深度値の差が大きければ境界部分、小さければ物体内部のピクセルと判断する。
ジャギーが発生するのは境界部分なので、境界にあるピクセルでだけ、シェーディングするサンプルの数を増やせば、物体内部の画素に対するシェーディング評価は1回でいいので、大幅に計算時間が削減できる。
しかし、プリミティブの境界にしか適用されないので、
ポリゴン内部に生じた描画されない(=アルファテストで破棄された)ピクセルの境界に対しては効果を発揮しません。
Alpha-to-coverage:α値0.5のとき 0.5 x 元のサンプリング数のピクセルを取得することで、α=50%でのブレンド処理と近い画像になります。
α=0のピクセルは出力しないため、アルファテストは不要になります。

https://zerogram.info/blog/?p=2029
 
GradPass フ レ ー ム バ ッ フ ァ の 値 を テ ク ス チ ャ として取得します

GrabPass{} Pass内に宣言する
sampler2D _GrabTexture; 現在の描画結果のテクスチャ
ComputeGrabScreenPos(o.vertex); Uv値を求めるために使用
ガラスの屈折を表現するには、周囲の色を取得して歪みとし て描写する必要があります。GrabPass を使えば実質的にフレームバッファ全体にアクセスできるので、 そのような表現に必要な情報の取得が可能になります。
Fallback 全ての SubShader が実行できない時に指定したシェーダー名を使用する
例)Fallback "name"
引数に "Off" を設定した場合、実行できる SubSahder をハードウェアが見つけられなかった場合も、 警告を出さず、フォールバック処理も行いません。
例)Fallback Off