このページは、ShaderLab コードの Properties
ブロックを使用して、Shader オブジェクトのマテリアルプロパティを定義するための情報を掲載しています。
ShaderLab コードでは、マテリアルプロパティ を定義することができます。マテリアルプロパティとは、Unity がマテリアルアセットの一部として保存するプロパティのことです。 これにより、アーティストは様々な構成のマテリアルを作成、編集、共有することができます。
マテリアルプロパティを使用する場合
マテリアルプロパティを使用しない場合 * マテリアルの関数を呼び出しによっても、Shader オブジェクトの変数の値を取得したり設定したりすることができます。 * これらの値のビジュアルエディターはありません。 * 変更はセッション間で持続しません。
マテリアルプロパティを作成しないのは、通常、シェーダープロパティの値をスクリプトを使ってすべて設定したい場合 (プロシージャルコンテンツを作っている場合など) や、プロパティをマテリアルプロパティにできない場合、 Inspector で編集されたくない場合などです。
機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
---|---|---|---|---|
ShaderLab: Properties ブロック | あり | 可 HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。 |
可 HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。 |
可 HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。 |
ShaderLab の Shader オブジェクトにマテリアルプロパティを割り当てるには、Properties
ブロックを Shader
ブロックの中に配置します。
シグネチャ | 機能 |
---|---|
Properties { <Material property declaration> <Material property declaration> }
|
指定のプロパティをマテリアルアセットの一部として保存し、レンダリング時にマテリアルアセットに保存された値を使用します。Properties ブロックには、任意の数のマテリアルプロパティ宣言を含むことができます。 |
すべてのマテリアルのプロパティ宣言は、この基本的な形式に沿っています。
[optional: attribute] name("display text in Inspector", type name) = default value
正確な構文は、型によって異なります。
このセクションには、以下の情報が含まれています。
型名とデフォルト値の構文は、プロパティの型によって異なります。
シェーダーコードの場合。すべてのプロパティ名はアンダースコアで始まるのが一般的です。このページの例では、この規則に従っています。
タイプ | 構文例 | コメント |
---|---|---|
整数 | _ExampleName ("Integer display name", Integer) = 1 |
This type is backed by a real integer (unlike the legacy Int type described below, which is backed by a float). Use this instead of Int when you want to use an integer. |
Int (legacy) | _ExampleName ("Int display name", Int) = 1 |
Note: This legacy type is backed by a float, rather than an integer. It is supported for backwards compatibility reasons only. Use the Integer type instead. |
Float |
_ExampleName ("Float display name", Float) = 0.5 _ExampleName ("Float with range", Range(0.0, 1.0)) = 0.5
|
レンジスライダーの最大値と最小値を含みます。 |
Texture2D |
_ExampleName ("Texture2D display name", 2D) = "" {} _ExampleName ("Texture2D display name", 2D) = "red" {}
|
デフォルト値の文字列に以下の値を入れると、Unity のビルトインテクスチャの 1 つを使用できます。“white” (RGBA: 1,1,1,1)、 “black” (RGBA: 0,0,0,1)、“gray” (RGBA: 0.5,0.5,0.5,1)、“bump” (RGBA: 0.5,0.5,1,0.5)、“red” (RGBA: 1,0,0,1) 文字列を空にしたり、無効な値を入力したりすると、デフォルトで “グレー” になります。 ** ノート:** これらのデフォルトテクスチャは Inspector では表示されません。 |
Texture2DArray | _ExampleName ("Texture2DArray display name", 2DArray) = "" {} |
詳しくは、テクスチャアレイ を参照してください。 |
Texture3D | _ExampleName ("Texture3D", 3D) = "" {} |
デフォルトはグレー (RGBA:0.5,0.5,0.5,1) のテクスチャです。 |
Cubemap | _ExampleName ("Cubemap", Cube) = "" {} |
デフォルトはグレー (RGBA:0.5,0.5,0.5,1) のテクスチャです。 |
CubemapArray | _ExampleName ("CubemapArray", CubeArray) = "" {} |
キューブマップアレイ を参照してください。 |
Color (色) | _ExampleName("Example color", Color) = (.25, .5, .5, 1) |
これは、シェーダーコードの float4 にマップされます。 マテリアルインスペクターにカラーピッカーが表示されます。値を 4 つの個別のフロートとして編集したい場合は、Vector 型を使用します。 |
Vector | _ExampleName ("Example vector", Vector) = (.25, .5, .5, 1) |
これは、シェーダーコードの float4 にマップされます。 マテリアルインスペクターでは、4 つの個別のフロートフィールドが表示されます。カラーピッカーを使って値を編集したい場合は、Color 型を使用します。 |
マテリアルのプロパティ宣言には、どのように処理するかを Unity に指示するオプション属性を付けることができます。
ここに挙げた属性に加えて、同じ構文を使って、マテリアルプロパティにMaterialPropertyDrawer を追加することができます。これらによって、マテリアルプロパティが Inspector ウィンドウにどのように表示されるかを制御することができます。
属性 | 機能 |
---|---|
[Gamma] |
float または vector のプロパティが sRGB 値を使用することを示します。つまり、プロジェクトの色空間がこれを必要とする場合、他の sRGB 値とともに変換する必要があることを意味しています。詳細については、Shader プログラムのプロパティ を参照してください。 |
[HDR] |
テクスチャまたはカラープロパティが ハイダイナミックレンジ (HDR) の値を使用することを示します。 テクスチャプロパティの場合、LDR テクスチャが割り当てられていると、Unity エディターは警告を表示します。カラープロパティの場合、Unity エディターは HDR カラーピッカーを使ってこの値を編集します。 |
[HideInInspector] |
Inspector でこのプロパティを隠すように Unity エディターに指示します。 |
[MainTexture] |
Material のメインテクスチャを設定します。マテリアルには、Material.mainTexture を使ってアクセスできます。 デフォルトでは、Unity はプロパティ名が _ MainTex のテクスチャをメインテクスチャと見なします。このアトリビュートを複数回使用すると、Unity は最初のプロパティを使用し、それ以降のプロパティは無視します。 ** ノート:** この属性を使用してメイン テクスチャを設定すると、テクスチャストリーミングデバッグビューモードやカスタムデバッグツールを使用する場合に、ゲームビューにテクスチャが表示されなくなります。 |
[MainColor] |
Material のメインカラーを設定します。マテリアルには、Material.color を使ってアクセスできます。 デフォルトでは、Unity はプロパティ名が _Color の色をメインカラーと見なします。色のプロパティ名が違うけれど、Unity にこの色をメインカラーと認識させたい場合は、この属性を使用します。この属性を複数回使用すると、Unity は、最初のプロパティを使用し、そ例外は無視します。 |
[NoScaleOffset] |
このテクスチャプロパティのタイリングとオフセットのフィールドを隠すように Unity エディターに指示します。 |
[Normal] |
テクスチャプロパティが法線マップであるべきことを示します。 互換性のないテクスチャを割り当てると、Unity エディターに警告が表示されます。 |
[PerRendererData] |
テクスチャプロパティは、MaterialPropertyBlock の形式で、レンダラーごとのデータから作られることを示しています。 マテリアルインスペクターはこのプロパティを読み取り専用として表示します。 |
マテリアルプロパティは、C#コードでは MaterialProperty クラスで表されます。
HLSL コードで定義された変数にアクセスするには、Material.GetFloat、Material.SetFloat を呼び出します。他にも似たようなメソッドがあります。完全なリストは Material API ドキュメント を参照してください。これらの API を使用して HLSL 変数にアクセスする場合、その変数がマテリアルのプロパティであるかどうかは問題ではありません。
Unity エディターでは、Inspector ウィンドウに表示されるマテリアルのプロパティを制御することができます。最も簡単な方法は、MaterialPropertyDrawer を使うことです。より複雑なニーズがある場合は、MaterialEditor 、MaterialProperty 、ShaderGUI クラスを使用できます。シェーダ用のカスタム GUI の作成については、ShaderLab:assigning a custom editor を参照してください。
マテリアルプロパティから ShaderLab コードの変数の値を設定するには、ShaderLab コードでマテリアルプロパティ名を角かっこ [] で囲みます。
このサンプルコードは、マテリアルプロパティを使用して、ShaderLab Offset
コマンドの units
値を設定するための構文を示しています。
Shader "Examples/MaterialPropertyShaderLab"
{
Properties
{
// マテリアルインスペクターでこの値を変更して、Offset コマンドの値に影響を与えます
_OffsetUnitScale ("Offset unit scale", Integer) = 1
}
SubShader
{
// SubShader の残りの部分を定義するコードをここに記述
Pass
{
Offset 0, [_OffsetUnitScale]
// Pass の残りの部分を定義するコードをここに記述
}
}
}
マテリアルプロパティを使って HLSL コードの変数の値を設定するには、マテリアルプロパティにシェーダープロパティと同じ名前を付けます。
このテクニックに関しては、以下のページも参照してください。実際のコード例も掲載されています。