ShaderLab シンタックス
ShaderLab :サブシェーダー

ShaderLab :プロパティー

シェーダーにより、Unity の マテリアルインスペクター 上で、アーティストがセットできるパラメーターの一覧を定義できます。 プロパティーは シェーダーファイルの Properties ブロックで定義します。

構文

プロパティー

Properties { Property [Property ...] }

プロパティーのブロックを定義します。波括弧{}の中で次のように複数のプロパティーを定義します。

数字とスライダー

name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number

これらを使い、数 (数量) プロパティーのデフォルト値を決定します。 Range は、スライダーの 最小最大 の範囲を決定します。

Color と Vector

name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)

これらを使い、カラープロパティーの RGBA 成分のデフォルト値や 4D ベクトルプロパティーのデフォルト値を決定します。 カラープロパティーにはカラーピッカーがついており、色空間にしたがい、必要に応じて調整されます ( Properties in Shader Programs 参照 ) 。ベクトルでのプロパティーは、4つの数値欄として表示されます。

テクスチャ

name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}

これらを使い、2D テクスチャキューブマップ3D (体積) プロパティーをそれぞれ決定します。

詳細

シェーダーの各プロパティーは name により参照されます( Unity で、シェーダーのプロパティー名をアンダースコアで始めるのは一般的)。プロパティーはマテリアルインスペクター上で display name として表示されます。各プロパティーのデフォルト値は等号(=)のあとに記述します。

  • RangeFloat プロパティーでは “13.37” のように 1 つの数字です。
  • ColorVector プロパティーでは “(1, 0.5, 0.2, 1)” のように括弧()で括る 4 つの数字です。
  • テクスチャ( 2D , Cube )ではデフォルト値は空の文字列か内蔵のデフォルトテクスチャ: “ white ”、“ black ”、“ gray ”、“ bump

後に、シェーダー関数では、括弧で囲ったプロパティーネーム [name] でプロパティーの値にアクセスします。 例えば、それを利用してマテリアルプロパティーでブレンドモードを行うことができます。 2つの整数プロパティーを宣言して (例えば “SrcBlend“ と ”DstBlend”)、 後で、それらを使用して Blend [_SrcBlend] [_DstBlend] のように Blend コマンドを行います。

プロパティー ブロックのシェーダーパラメーターは、マテリアル データとしてシリアライズされています。 実際は、シェーダープログラム には、ランタイムにコードからマテリアルに設定できるパラメーター (マトリクス、ベクトル、float型など) がもっとあります。 しかし、それらがプロパティーブロックにないと、その値は保存されません。 これは主に、完全にスクリプトコード制御される値 (Material.SetFloat と類似関数を使用) に有用です。

プロパティーの属性と Drawer

プロパティーの前に、括弧で囲ったオプションの属性を指定することができます。 Unity に認識される属性か、または、 ユーザー自身の MaterialPropertyDrawer クラス で属性を示し、 マテリアルインスペクター でレンダリングを制御します。 Unity で認識できる属性は以下のとおりです。

  • [HideInInspector] - マテリアルインスペクターでプロパティー値を表示しません。
  • [NoScaleOffset] - 属性のテクスチャプロパティーに関して、マテリアルインスペクターの texture tiling/offset 欄を表示しません。
  • [Normal] - テクスチャプロパティーが法線マップであることを示しています。
  • [HDR] - テクスチャプロパティーが High Dramatic Range (HDR) テクスチャであることを示しています。
  • [Gamma] - Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。
  • [PerRendererData] - テクスチャプロパティーは、MaterialPropertyBlock の形式の各レンダラーごとのデータであることを示しています。 マテリアルインスペクターでは、このプロパティー用に テクスチャ部分の UI が変わります。

// properties for a water shader
Properties
{
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
    _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) // color
    _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

テクスチャプロパティーのオプション ( Unity 5 では削除されました)

Unity 5 になる前は、テクスチャプロパティーで {} 内に TexGen CubeReflect のようなオプションを設定することができました。 これらは、固定関数テクスチャ座標生成を制御していましたが、5.0 では取り除かれました。 TexGen が必用な場合は、代わりに、頂点シェーダーを書いてください。 シェーダーに固定関数 TexGen を実装するの例を参照してください。

関連項目

ShaderLab シンタックス
ShaderLab :サブシェーダー