ShaderLab シンタックス
ShaderLab :SubShader

ShaderLab: Properties

Shaders can define a list of parameters to be set by artists in Unity’s material inspector. The Properties block in the shader file defines them.



Properties { Property [Property ...] }

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


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

These all defines a number (scalar) property with a default value. The Range form makes it be displayed as a slider between min and max ranges.


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

Defines a color property with default value of given RGBA components, or a 4D vector property with a default value. Color properties have a color picker shown for them, and are adjusted as needed depending on the color space (see Properties in Shader Programs). Vector properties are displayed as four number fields.


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 テクスチャでは、デフォルト値は空の文字列か、以下のビルトインのデフォルトテクスチャのうちの 1 つです:“白” (RGBA:1,1,1,1)、“黒” (RGBA:0,0,0,0)、“グレー” (RGBA:0.5,0.5,0.5,0.5)、“バンプ” (RGBA:0.5,0.5,1,0.5)、“赤” (RGBA:1,0,0,0)。
  • 2D テクスチャ以外 (立方体、3D、2D 行列) では、デフォルト値は空の文字列です。マテリアルに割り当てられたキューブマップ/3D/配列のテクスチャがないとき、“グレー” (RGBA:0.5,0.5,0.5,0.5) が使用されます。

Later on in the shader’s fixed function parts, property values can be accessed using property name in square brackets: [name]. For example, you could make blending mode be driven by a material property by declaring two integer properties (say “_SrcBlend” and “_DstBlend”), and later on make Blend Command use them: Blend [_SrcBlend] [_DstBlend].

Shader parameters that are in the Properties block are serialized as Material data. Shader programs can actually have more parameters (like matrices, vectors and floats) that are set on the material from code at runtime, but if they are not part of the Properties block then their values will not be saved. This is mostly useful for values that are completely script code-driven (using Material.SetFloat and similar functions).

プロパティーの属性と Drawer

In front of any property, optional attributes in square brackets can be specified. These are either attributes recognized by Unity, or they can indicate your own MaterialPropertyDrawer classes to control how they should be rendered in the material inspector. Attributes recognized by Unity:

  • [HideInInspector] - マテリアルインスペクターでプロパティー値を表示しません。
  • [NoScaleOffset] - 属性のテクスチャプロパティーに関して、マテリアルインスペクターの texture tiling/offset 欄を表示しません。
  • [Normal] - テクスチャプロパティーが法線マップであることを示しています。
  • [HDR] - テクスチャプロパティーが High Dramatic Range (HDR) テクスチャであることを示しています。
  • [Gamma] - Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。
  • [PerRendererData] - indicates that a texture property will be coming from per-renderer data in the form of a MaterialPropertyBlock. Material inspector changes the texture slot UI for these properties.

// water シェーダーのプロパティー
    _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 では削除されました)

Before Unity 5, texture properties could have options inside the curly brace block, e.g. TexGen CubeReflect. These were controlling fixed function texture coordinate generation. This functionality was removed in 5.0; if you need texgen you should write a vertex shader instead. See Implementing Fixed Function TexGen page page for examples.


ShaderLab シンタックス
ShaderLab :SubShader