色の入力を備えた URP Unlit シェーダー
この例の Unity シェーダーは、マテリアルに Base Color プロパティを追加します。そのプロパティを使用して色を選択でき、選択した色がシェーダーによってメッシュ形状に塗られます。
URP の基本的な Unlit シェーダー セクションの Unity シェーダーソースファイルを使用し、ShaderLab コードに以下の変更を加えます。
_BaseColor
プロパティの定義を Properties ブロックに追加します。Properties { [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1) }
この宣言によって
_BaseColor
プロパティが Base Color というラベルでマテリアルに追加されます。[MainColor]
属性のプロパティを宣言すると、Unity ではそのプロパティがマテリアルの メインカラー として使用されます。ノート: 互換性を確保するため、
_Color
というプロパティ名はあらかじめ予約されています。Unity では、[MainColor]
属性がなくても_Color
という名前のプロパティが メインカラー として使用されます。Properties ブロックでプロパティを宣言するときは、それを HLSL コードで宣言することも必要です。
ノート: Unity シェーダーと SRP Batcher の互換性を確保するため、マテリアルのすべてのプロパティを単一の
CBUFFER
ブロック内でUnityPerMaterial
という名前で宣言します。SRP Batcher について詳しくは、SRP (スクリプタブルレンダーパイプライン) Batcher のページを参照してください。頂点シェーダーの前に以下のコードを追加します。
CBUFFER_START(UnityPerMaterial) half4 _BaseColor; CBUFFER_END
フラグメントシェーダーのコードを
_BaseColor
プロパティを返すように変更します。half4 frag() : SV_Target { return _BaseColor; }
これで、Inspector ウィンドウの Base Color フィールドで色を選択できるようになりました。ここで選択した色がフラグメントシェーダーによってメッシュに塗られます。
以下は、この例の完成した ShaderLab コードです。
// このシェーダーは、ユーザーがマテリアルの Inspector ウィンドウを使用して
// 変更できる色でメッシュ形状を塗りつぶします。
Shader "Example/URPUnlitShaderColor"
{
// _BaseColor 変数はマテリアルの Inspector に Base Color フィールドとして
// 表示されます。そのフィールドを使用してカスタムカラーを選択できます。この変数には
// 初期値 (1, 1, 1, 1) があります。
Properties
{
[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
// Unity シェーダーと SRP Batcher の互換性を確保するため
// マテリアルに関連するすべてのプロパティを単一の CBUFFER ブロック内で
// UnityPerMaterial という名前で宣言します。
CBUFFER_START(UnityPerMaterial)
// 以下の行ではフラグメントシェーダーで使用できるように
// _BaseColor 変数を宣言します。
half4 _BaseColor;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag() : SV_Target
{
// _BaseColor 値を返します。
return _BaseColor;
}
ENDHLSL
}
}
}
テクスチャの描画 セクションには、メッシュ上にテクスチャを描画する方法が記載されています。