Version: 2021.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 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#コードによるマテリアルプロパティの使用

マテリアルプロパティは、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: フォールバックの割り当て