Subshader はタグを使用して、いつどのようにしてレンダリングエンジンでレンダリングするか指定します。
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
TagName1 が値 Value1、TagName2 が値 Value2 であることを指定します。タグの数に制限はありません。
タグは基本的に Key-Value ペアです。SubShader の中でタグは、サブシェーダーのレンダリング順や他のパラメーターを決定するのに使用されます。Unity により認識される以下のタグは、Pass の中でなく 必ず SubShader セクションの中に置くように注意してください。
Unity が認識するビルトインタグに加え、独自のタグを使用してそれらをクエリーにかけることもできます。それには Material.GetTag 関数を使用します。
Queue タグを使ってオブジェクトを描画する順番を決定できます。シェーダーは、オブジェクトが属するレンダリングキューを判断します。これによって、すべての不透明のオブジェクトが描画された後に、透過シェーダーで描画することができます。
4 つの定義済みのレンダーキューがありますが、定義済みのキューの間にさらにキューを追加することができます。定義済みのキューは以下の通りです。
Background
- このレンダリングキューは最初にレンダリングされます。一般的には、背景に必要なものに使用します。Geometry
(default) - ほとんどのオブジェクトに使用できます。不透明なジオメトリにはこのキューを使用します。AlphaTest
- アルファテストする形状でこのキューを使用します。Geometry
とは別のキューであるのはアルファテストのオブジェクトをすべての不透明のオブジェクトの後に描画するほうが効率的であるためです。Transparent
- このレンダリングキューは Geometry と AlphaTest
の処理後に、後方から手前へ向かってレンダリングされます。アルファブレンディングされるもの (すなわち、深度バッファに書き込みしないシェーダー) はすべて、ここに加えるべきです (ガラス、パーティクルエフェクトなど)。Overlay
- このレンダリングキューはオーバーレイ効果のためのものです。最後にレンダリングするものはここに加えるべきです (例えば、レンズフレア)。Shader "Transparent Queue Example"
{
SubShader
{
Tags { "Queue" = "Transparent" }
Pass
{
// シェーダーのボディの残りの部分...
}
}
}
透過キューでレンダリングする方法の例
特別な用途において、間にキューを使用することができます。各キューは内部で整数インデックスにより表され、Background
は 1000、Geometry
は 2000、AlphaTest
は 2450、Transparent
は 3000、Overlay
は 4000 です。シェーダーが以下のようなキューを使用すると仮定しましょう。
Tags { "Queue" = "Geometry+1" }
これによりオブジェクトはすべての不透明のオブジェクトの後にレンダリングされますが、透過 (Transparent) オブジェクトより先にレンダリングされます。なぜなら、レンダリングキューが 2001 (Geometry に 1 を加算) だからです。これは、他の一連のオブジェクトの前に描画したい場合に便利です。例えば、多くの場合に透明な水は不透明なオブジェクトの後、ただし透明なオブジェクトの前に描画します。
2500 (“Geometry+500”) までのキューは “不透明” とみなされ、オブジェクトの描画順はパフォーマンス重視で最適化されます。 これより大きいレンダーキューは “透明なオブジェクト” 用とみなされます。そして、オブジェクトは距離によってソートされ、最も遠いものから最も近いものの順にレンダリングされます。スカイボックスはすべての不透明なオブジェクトとすべての透明なオブジェクトの間に描画されます。
RenderType
タグはシェーダーを定義済みのいくつかのグループに分類します。これは シェーダーの置き換え に使用され、時には カメラの深度テクスチャ を生成するのに使用されます。
シェーダー (大抵はオブジェクトの空間で頂点のデフォーメーションを実行する) のなかには、ドローコールバッチング を使用していると、動作しないものがあります。ドローコールバッチングは、すべてのジオメトリをワールド空間に変換するので、“オブジェクト空間” が失われてしまうためです。
DisableBatching
タグを使うと、その処理を指示できます。以下の 3 つの値が設定可能です。“True” (このシェーダーでは、常にバッチングを無効にする)、“False” (バッチングを無効にしない、デフォルト設定)、“LODFading” (LOD フェードがアクティブな時は、バッチングを無効にする、大抵は樹木で使用)。
ForceNoShadowCasting
タグが使用されていて、値が “True” である場合、このサブシェーダーを使用して描画されるオブジェクトは影を投影しません。これは、たいてい、透過オブジェクトにシェーダーの置き換えを使用している場合や、別のサブシェーダーからシャドウパスを継承したくない場合に便利です。
IgnoreProjector
タグが使用されていて、値が “True” である場合、このシェーダーを使用するオブジェクトは プロジェクター からの影響を受けません。これは、たいてい、部分的に透過であるオブジェクトで便利です。なぜなら、プロジェクターがうまく影響できる方法がないためです。
シェーダーがスプライトに用いられ、アトラスにパックされたときに動作しない場合 (スプライトパッカー を参照) に、CanUseSpriteAtlas
タグを “False” に設定します。
PreviewType
タグは、マテリアルのインスペクタープレビューをどのように表示するかを示します。マテリアルはデフォルトでスフィアとして表示されますが、PreviewType タグは “Plane” (2D として表示) や “Skybox” (スカイボックスとして表示) にも設定できます。
Pass にもタグを指定することが可能です。詳細は ShaderLab: Pass 内の Tags を参照してください。