Version: 2020.3
言語: 日本語
ShaderLab: ビルトインレンダーパイプラインの定義済みパスタグ
ShaderLab: コマンド

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: コマンド