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
}
}
}