Version: 2021.1
言語: 日本語
ShaderLab: SubShader の定義
ShaderLab: LOD 値を SubShader に割り当てる

ShaderLab: タグを SubShader に割り当てる

このページには、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 タグ

SubShader でのタグブロックの使用

ShaderLab では、Tags ブロックを SubShader ブロック内に配置することで、SubShader にタグを割り当てます。

SubShader と Pass の両方が Tags ブロックを使用していますが、動作が異なることに注意してください。SubShader のタグを Pass に割り当てても効果はなく、その逆も同様です。その違いは以下に示すように、 Tags ブロックをどこに置くかによります。

  • パスタグを定義するには、Tags ブロックを、Pass ブロック内に配置します。
  • SubShader タグを定義するには、Tags ブロックを SubShader ブロック内に置き、かつ、Pass ブロックの外になるように配置します。

Pass へのタグの割り当てについては、Pass にタグを割り当てる を参照してください。

シグネチャ 機能
Tags { “[名前1]” = “[値1]” “[名前2]” = “[値2]”} 任意のタグを SubShader に適用します。

タグは数に制限なく定義できます。

C# コードでの 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 タグ

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 タグ

Queue タグは、Unity がレンダリングするジオメトリにどのレンダーキューを使用するかを指示します。レンダーキューは、Unity がジオメトリを描画する際の順序を決定する要因のひとつです。

構文と有効な値

Queue タグは、2 つの方法で使用できます。名前付きのレンダーキューを使用するように指示することも、名前付きのレンダーキューの後にレンダリングする無名のレンダーキューを使用するように指示することもできます。

シグネチャ 機能
“Queue” = “[キューの名前]” 名前付きのレンダーキューを使用します。
“Queue” = “[キューの名前] + [オフセット]” 名前のついたキューからの指定されたオフセットで名前のないキューを使用します。

これが役に立つ例として、すき通った水の場合があります。不透明なオブジェクトの後に、かつ、透明なオブジェクトより前に描く必要があります。
シグネチャ Value 機能
[キューの名前] Background Background のレンダーキューを指定します。
Geometry Geometry のレンダーキューを指定します。
AlphaTest AlphaTest のレンダーキューを指定します。
Transparent Transparent のレンダーキューを指定します。
Overlay Overlay のレンダーキューを指定します。
[オフセット] 整数 Unity が無名のキューをレンダリングする際の、名前付きキューに相対的なインデックスを指定します。

C# コードでのこのタグの使用

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 タグ

RenderType タグを使用して、Shader オブジェクトの動作をオーバーライドします。

ビルトインレンダーパイプラインでは、シェーダーの置き換え と呼ばれる技術を使って、ランタイムに SubShader を交換することができます。このテクニックは、RenderType タグの値が一致する SubShader を識別することで機能します。これは、カメラの深度テクスチャ を生成するために使用される場合があります。

スクリプタブルレンダーパイプラインをベースにしたレンダーパイプラインでは、RenderStateBlock 構造体を使って、シェーダーオブジェクトで定義されたレンダー状態をオーバーライドすることができます。RenderType タグの値を使って、オーバーライドする SubShader を特定できます。

構文と有効な値

シグネチャ 機能
“RenderType” = “[renderType]” この SubShader の RenderType 値を設定します。
シグネチャ Value 機能
[renderType] 文字列 このパラメーターには決まった値がありません。このパラメーターの設定値はありません。 置き換えたい SubShader の RenderType 値を特定するには、そのシェーダーソースファイルを開きます。

Unity の古いビルトインシェーダーの RenderType SubShader タグは、シェーダーの置き換え のページに一覧表示されています。

カスタムの SubShader に独自の値を作成することもできます。

C# コードでのこのタグの使用

ビルトインレンダーパイプラインでのシェーダーの置き換えについては、シェーダーの置き換え を参照してください。スクリプタブルレンダーパイプラインでの RenderStateBlock の使用については、スクリプトリファレンスの ScriptableRenderContext.DrawRenderers を参照してください。

このコード例では、RenderType の値が TransparentCutout の SubShader を作成しています。

Shader "ExampleShader" {
    SubShader {
        Tags { "RenderType" = "TransparentCutout" }
        Pass {
            …
        }
    }
}

ForceNoShadowCasting タグ

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 タグ

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 タグ

ビルトインレンダーパイプラインでは、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 タグ

PreviewType SubShader タグは、この SubShader を使用しているマテリアルを Inspector でどのように表示するかを Unity エディターに伝えます。

構文と有効な値

シグネチャ 機能
“PreviewType” = “[形状]” Unity エディターが、この SubShader を使用するマテリアルのプレビューを表示する際に使用する形状。
シグネチャ Value 機能
[形状] Sphere マテリアルを球体に表示します。これはデフォルト値です。
Plane マテリアルを平面に表示します。
スカイボックス マテリアルをスカイボックスに表示します。

このコード例では、PreviewType の値が Plane の SubShader を作成します。

Shader "ExampleShader" {
    SubShader {
        Tags { "PreviewType" = "Plane" }
        Pass {
            …
        }
    }
}

CanUseSpriteAtlas タグ

古いスプライトパッカー を使用するプロジェクトでこの SubShader タグを使用して、シェーダーが元のテクスチャ座標に依存しているため、テクスチャをアトラスにパックすべきではないことをユーザーに警告します。

構文と有効な値

シグネチャ 機能
“CanUseSpriteAtlas” = “[状態]” この SubShader を使用するスプライトが、古いスプライトパッカーと互換性があるかどうか。
シグネチャ Value 機能
[状態] True この SubShader を使用するスプライトは、古いスプライトパッカーと互換性があります。これはデフォルト値です。
False このサブシェーダーを使用するスプライトは、古いスプライトパッカーと互換性がありません。

CanUseSpriteAtlas の値が False の SubShader が、Legacy Sprite Packer のパッキングタグを持つ Sprite によって使用されると、Unity は Inspector にエラーメッセージを表示します。

CanUseSpriteAtlas タグのコード例

このサンプルコードでは、CanUseSpriteAtlas の値が False の SubShader を作成します。

Shader "ExampleShader" {
    SubShader {
        Tags { "CanUseSpriteAtlas" = "False" }
        Pass {
            …
        }
    }
}
ShaderLab: SubShader の定義
ShaderLab: LOD 値を SubShader に割り当てる