Version: 2023.2
言語: 日本語
ShaderLab: シェーダーオブジェクトの定義
ShaderLab: フォールバックの割り当て

ShaderLab: マテリアルプロパティの定義

このページは、ShaderLab コードの Properties ブロックを使用して、Shader オブジェクトのマテリアルプロパティを定義するための情報を掲載しています。

概要

ShaderLab コードでは、マテリアルプロパティ を定義することができます。マテリアルプロパティとは、Unity がマテリアルアセットの一部として保存するプロパティのことです。これにより、アーティストは様々な構成のマテリアルを作成、編集、共有することができます。

マテリアルプロパティを使用する場合

  • マテリアルの関数を呼び出すことで、Shader オブジェクトの変数の値を取得または設定することができます (Material.SetFloat など)。
  • マテリアルインスペクターを使って値を表示編集することができます。
  • Unity は、行った変更をマテリアルアセットの一部として保存します。そのため、変更はセッション間で保持されます。

マテリアルプロパティを使用しない場合

  • マテリアルの関数を呼び出しによっても、Shader オブジェクトの変数の値を取得したり設定したりすることができます。
  • これらの値のビジュアルエディターはありません。
  • 変更はセッション間で持続しません。

マテリアルプロパティを作成しないのは、通常、シェーダープロパティの値をスクリプトを使ってすべて設定したい場合 (プロシージャルコンテンツを作っている場合など) や、プロパティをマテリアルプロパティにできない場合、 Inspector で編集されたくない場合などです。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
ShaderLab: Properties ブロック
HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。

HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。

HLSL コードでは、SRP バッチャーの互換性のために、マテリアルごとの変数を同じ CBUFFER に置く必要があります。

Properties ブロックの使用

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 この型は実整数に基づいています (浮動小数点数に基づいている後述のレガシーな Int 型とは異なります)。整数を使用する必要がある場合は、Int の代わりにこれを使用してください。
Int (レガシー) _ExampleName ("Int display name", Int) = 1 ノート: このレガシー型は、整数ではなく、浮動小数点数に基づいています。これは後方互換性のためにのみサポートされています。代わりに Integer 型を使用してください。
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" {}
Put the following values in the default value string to use one of Unity’s built-in textures: “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,1) or “red” (RGBA: 1,0,0,1).

If you leave the string empty or enter an invalid value, it defaults to “gray”.

Note: these default textures are not visible in the 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 では、マテリアルプロパティにいくつかの予約名があります。これらの名前のいずれかを持つマテリアルプロパティを作成すると、Unity は定義済みの操作を実行します。この機能を使用する意図がない限り、これらの名前を使用しないでください。

名前 構文例 機能
_TransparencyLM _TransparencyLM ("Transmissive Texture", 2D) = "white" {} ライトマッピング中にカスタム RGB 透過を有効にします。

詳細は ライトマッピングとシェーダー を参照してください。

マテリアルのプロパティ属性

マテリアルのプロパティ宣言には、どのように処理するかを 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#コードによるマテリアルプロパティの使用

マテリアルプロパティは、C#コードでは MaterialProperty クラスで表されます。

HLSL コードで定義された変数にアクセスするには、Material.GetFloatMaterial.SetFloat を呼び出します。他にも似たようなメソッドがあります。完全なリストは Material API ドキュメント を参照してください。これらの API を使用して HLSL 変数にアクセスする場合、その変数がマテリアルのプロパティであるかどうかは問題ではありません。

Unity エディターでは、Inspector ウィンドウに表示されるマテリアルのプロパティを制御することができます。最も簡単な方法は、MaterialPropertyDrawer を使うことです。より複雑なニーズがある場合は、MaterialEditorMaterialPropertyShaderGUI クラスを使用できます。シェーダ用のカスタム GUI の作成については、ShaderLab:assigning a custom editor を参照してください。

マテリアルプロパティを使って ShaderLab コードに変数を設定

マテリアルプロパティから ShaderLab コードの変数の値を設定するには、ShaderLab コードでマテリアルプロパティ名を角かっこ [] で囲みます。

このサンプルコードは、マテリアルプロパティを使用して、ShaderLab Offset コマンドの units 値を設定するための構文を示しています。

Shader "Examples/MaterialPropertyShaderLab"
{
    Properties
    {
        // マテリアルインスペクターでこの値を変更して、Offset コマンドの値に影響を与えます
        _OffsetUnitScale ("Offset unit scale", Integer) = 1
    }
    SubShader
    {
        // SubShader の残りの部分を定義するコードをここに記述

        Pass
        {
            Offset 0, [_OffsetUnitScale]

           // Pass の残りの部分を定義するコードをここに記述
        }
    }
}

マテリアルプロパティを使って HLSL コードの変数を設定

マテリアルプロパティを使って HLSL コードの変数の値を設定するには、マテリアルプロパティにシェーダープロパティと同じ名前を付けます。

このテクニックに関しては、以下のページも参照してください。実際のコード例も掲載されています。

ShaderLab: シェーダーオブジェクトの定義
ShaderLab: フォールバックの割り当て