Unityでは、通常、シェーダープログラムは HLSL で書きます。HLSL コードを シェーダーアセット に加えるには、シェーダコードブロック の中にコードを入れます。
このページには、シェーダーコードブロックの使用に関する情報が含まれています。HLSL 自体の書き方については、Unity での HLSL を参照してください。
ノート: Unity は他の言語でシェーダープログラムを書くこともサポートしていますが、これは一般的には必要ありませんし、推奨されていません。詳細については、シェーダーの作成 を参照してください。
| 機能 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタムスクリプタブルレンダーパイプライン | 
|---|---|---|---|---|
| HLSLPROGRAM | 可 | 可 | 可 | 可 | 
| HLSLINCLUDE | 可 | 可 | 可 | 可 | 
| CGPROGRAM | 可 | なし | なし | 可 SRP Core パッケージを使用するカスタムレンダーパイプラインとの互換性はありません。  | 
| CGINCLUDE | 可 | なし | なし | 可 SRP Core パッケージを使用するカスタムレンダーパイプラインとの互換性はありません。  | 
HLSL コードを追加するには、以下のタイプのシェーダーコードブロックを使用できます。
どれをいつ使用するかを理解するには、プレフィックス (HLSL または CG) とサフィックス (PROGRAM または INCLUDE) の両方を理解する必要があります。
HLSL または CG で始まるブロックの違いは以下の通りです。
CG のプレフィックスがついたシェーダーコードブロックは古いものです。これらには Unity の ビルトインのシェーダー include ファイル のいくつかがデフォルトで含まれており、この機能が必要な場合には便利です。ビルトインのインクルードはビルトインレンダーパイプラインに対してのみ互換性があります。HLSL のプレフィックスがついたシェーダーコードブロックは新しいものです。これらはデフォルトでは Unity のビルトインシェーダーのインクルードファイルを含んでいません。そのため、使用したいライブラリコードは手動で加える必要があります。これらは、あらゆるレンダーパイプラインでの使用に適しています。Unity のビルトインシェーダーのインクルードファイルについては、ビルトインのシェーダー 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
        }
    }
}