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