Version: 2021.2
言語: 日本語
ShaderLab: ビルトインレンダーパイプラインの定義済みパスタグ
ShaderLab: specifying package requirements

ShaderLab: シェーダープログラムの追加

Unityでは、通常、シェーダープログラムは HLSL で書きます。HLSL コードを シェーダーアセット に加えるには、シェーダコードブロック の中にコードを入れます。

このページには、シェーダーコードブロックの使用に関する情報が含まれています。HLSL 自体の書き方については、Unity での HLSL を参照してください。

ノート: Unity は他の言語でシェーダープログラムを書くこともサポートしていますが、これは一般的には必要ありませんし、推奨されていません。詳細については、シェーダーの作成 を参照してください。

レンダーパイプラインの互換性

機能 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタムスクリプタブルレンダーパイプライン
HLSLPROGRAM はい はい はい はい
HLSLINCLUDE はい はい はい はい
CGPROGRAM はい いいえ いいえ

SRP Core パッケージを使用するカスタムレンダーパイプラインとの互換性はありません。
CGINCLUDE はい いいえ いいえ

SRP Core パッケージを使用するカスタムレンダーパイプラインとの互換性はありません。

シェーダーコードブロックのタイプ

HLSL コードを追加するには、以下のタイプのシェーダーコードブロックを使用できます。

  • HLSLPROGRAM
  • CGPROGRAM
  • HLSLINCLUDE
  • CGINCLUDE

どれをいつ使用するかを理解するには、プレフィックス (HLSL または CG) とサフィックス (PROGRAM または INCLUDE) の両方を理解する必要があります。

HLSL と CG のプレフィックス

HLSL または CG で始まるブロックの違いは以下の通りです。

  • CG のプレフィックスがついたシェーダーコードブロックは古いものです。これらは Unity の ビルトインシェーダーのインクルードファイル のいくつかをデフォルトで含んでおり、この機能が必要な場合には便利です。ビルトインのインクルードはビルトインレンダーパイプラインにのみ対応しています。
  • HLSL のプレフィックスがついたシェーダーコードブロックは新しいものです。これらはデフォルトでは Unity のビルトインシェーダーのインクルードファイルを含んでいません。そのため、使用したいライブラリコードは手動で加える必要があります。これらは、あらゆるレンダーパイプラインでの使用に適しています。

Unity のビルトインシェーダーのインクルードファイルについては、ビルトインシェーダーのインクルードファイル を参照してください。

PROGRAM と INCLUDE のサフィックス

PROGRAM または INCLUDE で終わるブロックの違いは以下の通りです。

  • PROGRAM で終わるシェーダーコードブロックは シェーダープログラムブロック と呼ばれます。シェーダープログラムを書くためにこれを使います。HLSL シェーダーコードをこれらのブロックの中に書き、ShaderLab コードの Pass ブロックの中に配置します。
  • INCLUDE で終わるシェーダーコードブロックは シェーダーインクルードブロック と呼ばれます。これらを使用して、同じソースファイル内のシェーダープログラムのブロック間で共通のコードを共有します。HLSL シェーダーコードをこれらのブロックの中に書き、ShaderLab コードの Pass、 SubShader、Shader のいずれかのブロックの中に配置します。

シェーダープログラムブロックの使用

シグネチャ 機能
HLSLPROGRAM
    [HLSL で書かれたシェーダープログラムのソースコード]
ENDHLSL
このシェーダープログラムブロックを含む Pass に HLSL シェーダープログラムを追加します。Unity のビルトインシェーダーのインクルードファイルは含まれません。
CGPROGRAM
    [HLSL で書かれたシェーダープログラムのソースコード]
ENDHLSL
このシェーダープログラムブロックを含む Pass に HLSL シェーダープログラムを追加します。Unity の ビルトインシェーダーのインクルードファイル がいくつか含まれます。

Shader "Examples/ExampleShader"
{
    SubShader
    {
        Pass
        {                
              Name "ExamplePassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // レンダー状態を設定する ShaderLab コマンドをここに記述

              HLSLPROGRAM
                // HLSL シェーダーコードをここに記述
              ENDHLSL
        }
    }
}

シェーダーインクルードブロックの使用

シグネチャ 機能
HLSLINCLUDE
    [共有したい HLSL コード]
ENDHLSL
Unity は、このソースファイル内の任意の場所の HLSLPROGRAM ブロックで定義されるすべてのシェーダープログラムにこのコードを加えます。
CGINCLUDE
    [共有したい HLSL コード]
ENDCG
Unity は、このソースファイル内の任意の場所の CGPROGRAM ブロックで定義されるすべてのシェーダープログラムにこのコードを加えます。

Shader "Examples/ExampleShader"
{
    SubShader
    {

        HLSLINCLUDE
            // HLSL code that you want to share goes here
        ENDHLSL

        Pass
        {                
              Name "ExampleFirstPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // レンダー状態を設定する ShaderLab コマンドをここに記述

              HLSLPROGRAM
                // この HLSL シェーダープログラムには、上記の HLSLINCLUDE ブロックの内容が自動的に含まれます
                // HLSL シェーダーコードをここに記述
              ENDHLSL
        }

        Pass
        {                
              Name "ExampleSecondPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // レンダー状態を設定する ShaderLab コマンドをここに記述

              HLSLPROGRAM
                // この HLSL シェーダープログラムには、上記の HLSLINCLUDE ブロックの内容が自動的に含まれます
                // HLSL シェーダーコードをここに記述
              ENDHLSL
        }

    }
}
ShaderLab: ビルトインレンダーパイプラインの定義済みパスタグ
ShaderLab: specifying package requirements