Version: Unity 6.0 (6000.0)
言語 : 日本語
シェーダーへのマテリアルプロパティの追加
マテリアルのプロパティの追加

マテリアルプロパティの概要

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

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

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

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

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

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

プロパティ値がどのようにシェーダーに渡されるか

シェーダープロパティ値は以下の場所にあり、シェーダーに渡されます。

  • MaterialPropertyBlock に設定されたレンダラーごとの値。これは、一般的に “インスタンスごとの” データ (例えば、すべて同じマテリアルを共有する多数のオブジェクトに使用するカスタム化した色) です。
  • レンダリングしたオブジェクトに使用する マテリアル に設定された値。
  • Unity のレンダリングコード自体 (ビルトインのシェーダー変数 を参照) か、ユーザー自身のスクリプト (例えば、Shader.SetGlobalTexture) のいずれかによって設定されたグローバルシェーダープロパティ。

優先順位は上記で述べたとおりです。インスタンスごとのデータは、すべてをオーバーライドします。その次に、マテリアルデータが使用されます。最後に、その 2 つの場所にシェーダープロパティがない場合は、グローバルプロパティの値が使用されます。もし、シェーダープロパティ値がどこにも宣言されていない場合は、“デフォルト” 値 (float 型には 0、色には黒、テクスチャには空の白いテクスチャ) が設定されます。

シリアライズされたランタイムマテリアルプロパティ

マテリアル は、シリアライズされ、かつランタイムに設定されるプロパティ値を含みます。

シリアライズされたデータはすべて、シェーダーの Properties ブロックで宣言されたプロパティです。一般的に、これらの値はマテリアルに保管する必要があり、マテリアル Inspector でユーザーが調整することが可能です。

マテリアルには、シェーダーに使用されているにもかかわらず、シェーダーの Properties ブロックでは宣言されないプロパティが含まれることもあります。一般的に、これはランタイムにスクリプトコードから設定される (例えば Material.SetColor 経由で) プロパティです。マトリクスと配列は、(Properties ブロックで定義する方法がないため) シリアライズなしのランタイムプロパティとしてだけ存在することに注意してください。

シェーダーへのマテリアルプロパティの追加
マテリアルのプロパティの追加