URP の基本的な Unlit シェーダー
この例は、URP 互換の基本的なシェーダーを示しています。このシェーダーは、シェーダーコード内に事前定義されている色でメッシュ形状を塗りつぶします。
シェーダーの実際の動作を確認するには、以下の ShaderLab コードをコピーしてシェーダーアセット内に貼り付けます。
// このシェーダーはコード内に事前定義されている色でメッシュ形状を塗りつぶします。
Shader "Example/URPUnlitShaderBasic"
{
// Unity シェーダーのプロパティブロック。この例では出力の色がフラグメントシェーダーの
// コード内に事前定義されているため、このブロックは空です。
Properties
{ }
// シェーダーのコードが含まれる SubShader ブロック。
SubShader
{
// SubShader Tags では SubShader ブロックまたはパスが実行されるタイミングと条件を
// 定義します。
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
// HLSL コードブロック。Unity SRP では HLSL 言語を使用します。
HLSLPROGRAM
// この行では頂点シェーダーの名前を定義します。
#pragma vertex vert
// この行ではフラグメントシェーダーの名前を定義します。
#pragma fragment frag
// Core.hlsl ファイルには、よく使用される HLSL マクロおよび関数の
// 定義が含まれ、その他の HLSL ファイル (Common.hlsl、
// SpaceTransforms.hlsl など) への #include 参照も含まれています。
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// この構造体定義では構造体に含まれる変数を定義します。
// この例では Attributes 構造体を頂点シェーダーの入力構造体として
// 使用しています。
struct Attributes
{
// positionOS 変数にはオブジェクト空間内での頂点位置が
// 含まれます。
float4 positionOS : POSITION;
};
struct Varyings
{
// この構造体内の位置には SV_POSITION セマンティクスが必要です。
float4 positionHCS : SV_POSITION;
};
// Varyings 構造体内に定義されたプロパティを含む頂点シェーダーの
// 定義。vert 関数の型は戻り値の型 (構造体) に一致させる
// 必要があります。
Varyings vert(Attributes IN)
{
// Varyings 構造体での出力オブジェクト (OUT) の宣言。
Varyings OUT;
// TransformObjectToHClip 関数は頂点位置をオブジェクト空間から
// 同種のクリップスペースに変換します。
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
// 出力を返します。
return OUT;
}
// フラグメントシェーダーの定義。
half4 frag() : SV_Target
{
// 色変数を定義して返します。
half4 customColor = half4(0.5, 0, 0, 1);
return customColor;
}
ENDHLSL
}
}
}
フラグメントシェーダーによってゲームオブジェクトがダークレッド (RGB 値 (0.5, 0, 0)) に塗られます。
以下のセクションでは、この基本的な Unity シェーダーの構造を紹介します。
ShaderLab の基本構造
Unity シェーダーは、ShaderLab という Unity 固有の言語で記述します。
この例の Unity シェーダーには、以下のブロックが含まれています。
Shader ブロック
ShaderLab コードは、Shader
宣言から始まります。
Shader "Example/URPUnlitShaderBasic"
この宣言内のパスにより、マテリアルの Shader メニューにおける Unity シェーダーの表示名と場所が決まります。Shader.Find メソッドにもこのパスが使用されます。
Properties ブロック
Properties ブロックには、ユーザーがマテリアルの Inspector ウィンドウで設定できるプロパティの宣言が含まれます。
この例の場合、この Unity シェーダーではユーザーが定義できるマテリアルのプロパティが公開されないので、Properties ブロックは空です。
SubShader ブロック
Unity シェーダーのソースファイルには、1 つ以上の SubShader ブロックが含まれています。メッシュのレンダリング時に、Unity によって対象デバイスの GPU と互換性のある最初の SubShader が選択されます。
SubShader ブロックには、必要に応じて SubShader Tags ブロックを含めることができます。SubShader Tags ブロックを宣言するには、Tags
キーワードを使用します。
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
RenderPipeline
という SubShader タグには、どのレンダーパイプラインでこの SubShader を使用するかを Unity に伝える役割があり、UniversalPipeline
という値は、Unity が URP でこの SubShader を使用する必要があることを示しています。
同じシェーダーを異なるレンダーパイプラインで実行するには、RenderPipeline
タグ値が異なる複数の SubShader ブロックを作成します。SubShader ブロックを HDRP で実行するには、RenderPipeline
タグを HDRenderPipeline
に設定し、ビルトインレンダーパイプラインで実行するには、RenderPipeline
を空の値に設定します。
SubShader Tags の詳細については、ShaderLab: SubShader Tags を参照してください。
Pass ブロック
この例には、1 つの Pass ブロックがあり、HLSL プログラムのコードが含まれています。Pass ブロックの詳細については、ShaderLab: Pass を参照してください。
Pass ブロックには、必要に応じて Pass Tags ブロックを含めることができます。詳細については、URP ShaderLab の Pass tags を参照してください。
HLSLPROGRAM ブロック
このブロックには HLSL プログラムのコードが含まれます。
ノート: HLSL 言語は URP シェーダーの推奨言語です。
ノート: URP は CG 言語に対応しています。CGPROGRAM/ENDCGPROGRAM ブロックをシェーダーに追加すると、Unity ではビルトインレンダーパイプラインライブラリのシェーダーが自動的に含まれます。SRP シェーダーライブラリのシェーダーを含めた場合は、SRP シェーダーのマクロや関数の一部がビルトインレンダーパイプラインシェーダーの関数と競合することがあります。CGPROGRAM ブロックのあるシェーダーは SRP Batcher との互換性がありません。
このブロックには、Core.hlsl
ファイルへの参照を使用した #include
宣言が含まれています。
# include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
Core.hlsl
ファイルには、よく使用される HLSL マクロおよび関数の定義が含まれ、その他の HLSL ファイル (Common.hlsl
や SpaceTransforms.hlsl
など) への #include 参照も含まれています。
例えば、HLSL コード内の頂点シェーダーでは、SpaceTransforms.hlsl
ファイルの TransformObjectToHClip
関数を使用します。この関数によって頂点位置がオブジェクト空間から同種の空間に変換されます。
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
この基本的な HLSL コード内のフラグメントシェーダーからは、コード内に事前定義されている単一の色が出力されます。
half4 frag() : SV_Target
{
half4 customColor;
customColor = half4(0.5, 0, 0, 1);
return customColor;
}
色の入力を備えた URP Unlit シェーダー セクションには、マテリアルの Inspector ウィンドウで編集可能な色プロパティを追加する方法が記載されています。