このページには、ShaderLab コードの Tags
ブロックを使用して、タグを SubShader に割り当てるための情報が記載されています。
SubShader の定義については、ShaderLab: SubShader の定義](SL-SubShader.html) を参照してください。シェーダーオブジェクトがどのように機能するか、およびシェーダーオブジェクト、SubShader、Pass の関係については、シェーダーオブジェクト を参照してください。
タグは、データのキーと値のペアです。Unity は、事前定義されたキーと値を使用して、指定されたSubShader をいつどのように使用するかを決定します。または、カスタム値を使用して独自のカスタム SubShader タグを作成することもできます。C# コードから SubShader タグにアクセスできます。
機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
---|---|---|---|---|
ShaderLab: SubShader Tags ブロック | はい | はい | はい | はい |
ShaderLab: RenderPipeline SubShader タグ | なし | はい | はい | なし |
ShaderLab: Queue SubShader タグ | なし | はい | 可 |
可 ノート: カスタムの SRP では、独自のレンダリング順序を定義し、レンダーキューを使用するかどうかを選択できます。詳しくは、スクリプトリファレンスの DrawingSettings と SortingCriteria を参照してください。 |
ShaderLab: RenderType SubShader タグ | はい | はい | はい | はい |
ShaderLab: DisableBatching SubShader タグ | はい | はい | はい | はい |
ShaderLab: ForceNoShadowCasting SubShader タグ | はい | はい | 可 これは、通常のシャドウを無効にしますが、コンタクトシャドウには影響しません。 |
はい |
ShaderLab: CanUseSpriteAtlas SubShader タグ | はい | はい | はい | はい |
ShaderLab: PreviewType SubShader タグ | はい | はい | はい | はい |
ShaderLab では、Tags
ブロックを SubShader
ブロック内に配置することで、SubShader にタグを割り当てます。
SubShader と Pass の両方が Tags
ブロックを使用していますが、動作が異なることに注意してください。SubShader のタグを Pass に割り当てても効果はなく、その逆も同様です。その違いは以下に示すように、 Tags
ブロックをどこに置くかによります。
Tags
ブロックを、Pass
ブロック内に配置します。Tags
ブロックを SubShader
ブロック内に置き、かつ、Pass
ブロックの外になるように配置します。Pass へのタグの割り当てについては、Pass にタグを割り当てる を参照してください。
シグネチャ | 機能 |
---|---|
Tags { “[名前1]” = “[値1]” “[名前2]” = “[値2]”} | 任意のタグを SubShader に適用します。 タグは数に制限なく定義できます。 |
Material.GetTag API を使って、以下のように C# スクリプトから SubShader タグを読み取ることができます。
using UnityEngine;
public class Example : MonoBehaviour
{
// これを Renderer コンポーネントを持つゲームオブジェクトにアタッチします
string tagName = "ExampleTagName";
void Start()
{
Renderer myRenderer = GetComponent<Renderer>();
string tagValue = myRenderer.material.GetTag(ExampleTagName, true, "Tag not found");
Debug.Log(tagValue);
}
}
RenderPipeline
タグは、SubShader がユニバーサルレンダーパイプライン (URP) と HD レンダーパイプライン (HDRP) のどちらに対応しているかを Unity に伝えます。
シグネチャ | 機能 |
---|---|
“RenderPipeline” = “[名前]” | この SubShader が URP と HDRP のどちらに対応しているかを Unity に伝えます。 |
パラメーター | Value | 機能 |
---|---|---|
[名前] | UniversalRenderPipeline | この SubShader は、URP にのみに対応します。 |
HighDefinitionRenderPipeline | この SubShader は、HDRP にのみに対応します。 | |
(それ以外の値、または宣言されていない場合) | この SubShader は URP と HDRP のどちらにも対応しません。 |
このサンプルコードでは、SubShader が URP に対応することを宣言します。
Shader "ExampleShader" {
SubShader {
Tags { "RenderPipeline" = "UniversalRenderPipeline" }
Pass {
…
}
}
}
Queue
タグは、Unity がレンダリングするジオメトリにどのレンダーキューを使用するかを指示します。レンダーキューは、Unity がジオメトリを描画する際の順序を決定する要因のひとつです。
Queue
タグは、2 つの方法で使用できます。名前付きのレンダーキューを使用するように指示することも、名前付きのレンダーキューの後にレンダリングする無名のレンダーキューを使用するように指示することもできます。
シグネチャ | 機能 |
---|---|
“Queue” = “[キューの名前]” | 名前付きのレンダーキューを使用します。 |
“Queue” = “[キューの名前] + [オフセット]” | 名前のついたキューからの指定されたオフセットで名前のないキューを使用します。 これが役に立つ例として、すき通った水の場合があります。不透明なオブジェクトの後に、かつ、透明なオブジェクトより前に描く必要があります。 |
シグネチャ | Value | 機能 |
---|---|---|
[キューの名前] | Background | Background のレンダーキューを指定します。 |
Geometry | Geometry のレンダーキューを指定します。 | |
AlphaTest | AlphaTest のレンダーキューを指定します。 | |
Transparent | Transparent のレンダーキューを指定します。 | |
Overlay | Overlay のレンダーキューを指定します。 | |
[オフセット] | 整数 | Unity が無名のキューをレンダリングする際の、名前付きキューに相対的なインデックスを指定します。 |
Shader.renderQueue を使って、Shader オブジェクトのアクティブな SubShader の Queue タグ値を読み取ることができます。
デフォルトでは、Unity は [Queue] タグで指定されたレンダーキューでジオメトリをレンダリングします。この値はマテリアルごとにオーバーライドすることができます。Unity エディターでは、[マテリアルの Inspector]](class-Material.html) で、 Render Queue プロパティを設定することで、これを行うことができます。C# スクリプトでは、Rendering.RenderQueue enum を使って、Material.renderQueue の値を設定することで、これを行うことができます。
このサンプルコードでは、Transparent レンダーキューの一部としてジオメトリをレンダリングする SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
…
}
}
}
このサンプルコードでは、Geometry キューの後にある無名のキューにジオメトリをレンダリングする SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "Queue" = "Geometry+1" }
Pass {
…
}
}
}
RenderType
タグを使用して、Shader オブジェクトの動作をオーバーライドします。
ビルトインレンダーパイプラインでは、シェーダーの置き換え と呼ばれる技術を使って、ランタイムに SubShader を交換することができます。このテクニックは、RenderType
タグの値が一致する SubShader を識別することで機能します。これは、カメラの深度テクスチャ を生成するために使用される場合があります。
スクリプタブルレンダーパイプラインをベースにしたレンダーパイプラインでは、RenderStateBlock
構造体を使って、シェーダーオブジェクトで定義されたレンダー状態をオーバーライドすることができます。RenderType
タグの値を使って、オーバーライドする SubShader を特定できます。
シグネチャ | 機能 |
---|---|
“RenderType” = “[renderType]” | この SubShader の RenderType 値を設定します。 |
シグネチャ | Value | 機能 |
---|---|---|
[renderType] | 文字列 | このパラメーターには決まった値がありません。このパラメーターの設定値はありません。 置き換えたい SubShader の RenderType 値を特定するには、そのシェーダーソースファイルを開きます。 Unity の古いビルトインシェーダーの RenderType SubShader タグは、シェーダーの置き換え のページに一覧表示されています。カスタムの SubShader に独自の値を作成することもできます。 |
ビルトインレンダーパイプラインでのシェーダーの置き換えについては、シェーダーの置き換え を参照してください。スクリプタブルレンダーパイプラインでの RenderStateBlock の使用については、スクリプトリファレンスの ScriptableRenderContext.DrawRenderers を参照してください。
このコード例では、RenderType の値が TransparentCutout
の SubShader を作成しています。
Shader "ExampleShader" {
SubShader {
Tags { "RenderType" = "TransparentCutout" }
Pass {
…
}
}
}
ForceNoShadowCasting
タグは、SubShader 内のジオメトリが影を作る (場合によっては受ける) のを防ぎます。正確な動作は、レンダーパイプラインとレンダリングパスに依存します。
これは、シェーダーの置き換え を使用しているが、他の SubShader から影のパスを継承したくない場合に便利です。
シグネチャ | 機能 |
---|---|
“ForceNoShadowCasting” = “[状態]” | この SubShader を使用するすべてのジオメトリの影の作成 (場合によっては影を受けること) を防止するかどうか。 |
シグネチャ | Value | 機能 |
---|---|---|
[状態] | True | Unity は、この SubShader のジオメトリが影を作るのを防ぎます。 また、ビルトインレンダーパイプラインの Forward、Legacy Vertex Lit、Legacy Deferred のレンダリングパスでは、この SubShader のジオメトリが影を受けるのを防ぎます。 HDRP では、ジオメトリがコンタクトシャドウを作るのを防ぐことはできません。 |
False | Unity は、この SubShader 内のジオメトリが影を作ったり受け取ったりするのを防ぎません。これはデフォルト値です。 |
このサンプルコードでは、ForceNoShadowCasting の値を True
に設定した SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "ForceNoShadowCasting" = "True" }
Pass {
…
}
}
}
DisableBatching
SubShader タグは、Unity がこの SubShader を使用するジオメトリに動的バッチ を適用するのを防ぎます。
これは、オブジェクト空間の操作を行うシェーダープログラムに有用です。動的バッチはすべてのジオメトリをワールド空間に変換するため、シェーダープログラムはオブジェクト空間にアクセスできなくなります。そのため、オブジェクト空間に依存しているシェーダプログラムは正しくレンダリングできません。この問題を回避するには、この SubShader タグを使って、Unity が動的バッチを適用しないようにします。
シグネチャ | 機能 |
---|---|
“DisableBatching” = “[状態]” | Unity が、この SubShader を使用するすべてのジオメトリに対して動的バッチを防止するかどうか。 |
シグネチャ | Value | 機能 |
---|---|---|
[状態] | True | Unity は、この SubShader を使用するすべてのジオメトリに対して動的バッチを防止します。 |
False | Unity は、この SubShader を使用するすべてのジオメトリに対して動的バッチを防止しません。これは、デフォルト値です。 | |
LODFading | LODGroup の一部であり、Fade Mode の値が None ではないすべてのジオメトリに対して、Unity は動的バッチを防止します。それ以外の場合は、Unityは動的バッチを防止しません。 |
このサンプルコードでは、DisableBatching の値を True
に設定した SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "DisableBatching" = "True" }
Pass {
…
}
}
}
ビルトインレンダーパイプラインでは、IgnoreProjector
SubShader タグによって、ジオメトリがProjector の影響を受けるかどうかを Unity に伝えます。これは主に、Projector と互換性のない半透明のジオメトリを除外するのに便利です。
このタグは、他のレンダーパイプラインでは効果がありません。
シグネチャ | 機能 |
---|---|
“IgnoreProjector” = “[状態]” | Unity がこのジオメトリをレンダリングする際に Projector を無視するかどうか。 |
シグネチャ | Value | 機能 |
---|---|---|
[状態] | True | Unity は、このジオメトリをレンダリングする際に Projector を無視します。 |
False | Unity は、このジオメトリをレンダリングする際に Projector を無視しません。これはデフォルト値です。 |
このサンプルコードでは、IgnoreProjectors の値が True
の SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "IgnoreProjector" = "True" }
Pass {
…
}
}
}
PreviewType
SubShader タグは、この SubShader を使用しているマテリアルを Inspector でどのように表示するかを Unity エディターに伝えます。
シグネチャ | 機能 |
---|---|
“PreviewType” = “[形状]” | Unity エディターが、この SubShader を使用するマテリアルのプレビューを表示する際に使用する形状。 |
シグネチャ | Value | 機能 |
---|---|---|
[形状] | Sphere | マテリアルを球体に表示します。これはデフォルト値です。 |
Plane | マテリアルを平面に表示します。 | |
スカイボックス | マテリアルをスカイボックスに表示します。 |
このコード例では、PreviewType の値が Plane
の SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "PreviewType" = "Plane" }
Pass {
…
}
}
}
古いスプライトパッカー を使用するプロジェクトでこの SubShader タグを使用して、シェーダーが元のテクスチャ座標に依存しているため、テクスチャをアトラスにパックすべきではないことをユーザーに警告します。
シグネチャ | 機能 |
---|---|
“CanUseSpriteAtlas” = “[状態]” | この SubShader を使用するスプライトが、古いスプライトパッカーと互換性があるかどうか。 |
シグネチャ | Value | 機能 |
---|---|---|
[状態] | True | この SubShader を使用するスプライトは、古いスプライトパッカーと互換性があります。これはデフォルト値です。 |
False | このサブシェーダーを使用するスプライトは、古いスプライトパッカーと互換性がありません。CanUseSpriteAtlas の値が False の SubShader が、Legacy Sprite Packer のパッキングタグを持つ Sprite によって使用されると、Unity は Inspector にエラーメッセージを表示します。 |
このサンプルコードでは、CanUseSpriteAtlas の値が False
の SubShader を作成します。
Shader "ExampleShader" {
SubShader {
Tags { "CanUseSpriteAtlas" = "False" }
Pass {
…
}
}
}