シェーダーにより、Unity の マテリアルインスペクター 上で、アーティストがセットできるパラメーターの一覧を定義できます。 プロパティーは シェーダーファイル の Properties ブロックで定義します。
Properties { Property [Property ...] }
Properties ブロックを定義します。波括弧 {} の中で以下のように複数のプロパティーを定義します。
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
これらを使い、数 (数量) プロパティーのデフォルト値を決定します。
Range
は、スライダーの 最小 と 最大 の範囲を決定します。
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
これらを使い、指定した RGBA 成分のデフォルト値をもつカラープロパティーや、デフォルト値をもつ 4D ベクトルプロパティーを定義します。 カラープロパティーにはカラーピッカーがついており、色空間にしたがい、必要に応じて調整されます ( シェーダープログラムのプロパティー を参照 )。ベクトルのプロパティーは、4つの数値欄として表示されます。
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
これらはそれぞれ、2D テクスチャ、キューブマップ、3D (体積) プロパティーを決定します。
シェーダー内の各プロパティーは name で参照されます (Unity では、シェーダーのプロパティー名をアンダースコアで始めるのが一般的)。プロパティーはマテリアルインスペクター上で display name で表示されます。各プロパティーのデフォルト値は等号 (=) のあとに記述します。
後に、シェーダーの固定関数では、括弧で囲ったプロパティーネーム [name] でプロパティーの値にアクセスします。
例えば、それを利用してマテリアルプロパティーでブレンドモードを行うことができます。 2つの整数プロパティーを宣言して (例えば “SrcBlend“ と ”DstBlend”)、
後で、それらを使用して Blend [_SrcBlend] [_DstBlend]
のように Blend コマンドを行います。
プロパティー
ブロックのシェーダーパラメーターは、マテリアル データとしてシリアライズされています。
実際は、シェーダープログラム には、ランタイムにコードからマテリアルに設定できるパラメーター (マトリクス、ベクトル、float型など) がもっとあります。
しかし、それらがプロパティーブロックにないと、その値は保存されません。
これは主に、完全にスクリプトコード制御される値 (Material.SetFloat と類似関数を使用) に有用です。
プロパティーの前に、括弧で囲ったオプションの属性を指定することができます。 Unity に認識される属性か、または、 ユーザー自身の MaterialPropertyDrawer クラス で属性を示し、 マテリアルインスペクター でレンダリングを制御します。 Unity で認識できる属性は以下のとおりです。
[HideInInspector]
- マテリアルインスペクターでプロパティー値を表示しません。[NoScaleOffset]
- 属性のテクスチャプロパティーに関して、マテリアルインスペクターの texture tiling/offset 欄を表示しません。[Normal]
- テクスチャプロパティーが法線マップであることを示しています。[HDR]
- テクスチャプロパティーが High Dramatic Range (HDR) テクスチャであることを示しています。[Gamma]
- Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。[PerRendererData]
- テクスチャプロパティーは、MaterialPropertyBlock の形式の各レンダラーごとのデータであることを示しています。
マテリアルインスペクターでは、このプロパティー用に
テクスチャ部分の UI が変わります。// water シェーダーのプロパティー
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // スライダー
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // カラー
_ReflectionTex ("Environment Reflection", 2D) = "" {} // テクスチャ
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
Unity 5 になる前は、テクスチャプロパティーで {} 内に TexGen CubeReflect
のようなオプションを設定することができました。
これらは、固定関数テクスチャ座標生成を制御していましたが、5.0 では取り除かれました。
TexGen が必用な場合は、代わりに、頂点シェーダーを書いてください。
シェーダーに固定関数 TexGen を実装するの例を参照してください。