Shader はマテリアルプロパティーを Properties ブロックで宣言します。もし シェーダーのプログラムでアクセスしたい場合、Cg/HLSL 変数を同じ名前とマッチングするタイプで宣言する必要があります。例については シェーダー: 頂点とフラグメントプログラムを参照してください。
例えば次のシェーダープロパティー
_MyColor ("Some Color", Color) = (1,1,1,1)
_MyVector ("Some Vector", Vector) = (0,0,0,0)
_MyFloat ("My float", Float) = 0.5
_MyTexture ("Texture", 2D) = "white" {}
_MyCubemap ("Cubemap", CUBE) = "" {}
について、Cg/HLSL で参照するために宣言するコードは以下のとおりです。
fixed4 _MyColor; //color には通常、低精度型で十分です
float4 _MyVector;
float _MyFloat;
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
Cg/HLSL は uniform キーワードを記述できますが、必須ではありません。
uniform float4 _MyColor;
ShaderLab のプロパティータイプは Cg/HLSL 変数タイプとの対応は次のようにマッピングされます。
シェーダープロパティー値は以下の場所にあり、シェーダーに渡されます。
優先順位は上記で述べたとおりです。インスタンスごとのデータは、すべてをオーバーライドします。その次に、マテリアルデータが使用されます。最後に、その 2つの場所にシェーダープロパティーがない場合は、グローバルプロパティーの値が使用されます。もし、シェーダープロパティー値がどこにも宣言されていない場合は、「デフォルト」値 (float型には 0、カラーには黒、テクスチャには空の白いテクスチャ) が設定されます。
マテリアルは、シリアライズされ、かつランタイムに設定されるプロパティー値を含みます。
シリアライズされたデータはすべて、シェーダーの プロパティーブロックで宣言されたプロパティーです。一般的に、これらの値はマテリアルに保管する必要があり、マテリアルインスペクターでユーザーが調整することが可能です。
マテリアルには、シェーダーに使用されているにもかかわらず、シェーダーの プロパティーブロックでは宣言されないプロパティーが含まれることもあります。一般的に、これはランタイムにスクリプトコードから設定される (例えば Material.SetColor 経由で) プロパティーです。マトリクスと配列は、(決してプロパティーブロックでこれらを定義できないため)、シリアライズなしのランタイムプロパティーとしてだけ存在することに注意してください 。
シェーダー、または、マテリアルプロパティーとして設定されるそれぞれのテクスチャに対し、Unity では付加的なベクトルプロパティーで追加情報を設定することも可能です。
マテリアルには、しばしばテキストプロパティーに Tiling と Offset フィールドがあります。この情報は、シェーダーの float4 {TextureName}_ST
プロパティーに渡されます。
x
には Tiling 値 X が含まれます。y
には Tiling 値 Y が含まれます。z
には Offset 値 X が含まれます。w
には Offset 値 Y が含まれます。例えば、シェーダーに _MainTex
というテクスチャが含まれているなら、その Tiling の情報は _MainTex_ST
ベクトルにあるはずです。
{TextureName}_TexelSize
- テクスチャサイズの情報を含む float4 プロパティー。
x
には 1.0/width が含まれますy
には 1.0/height が含まれますz
には width が含まれますw
には height が含まれます{TextureName}_HDR
- float4 プロパティー。使用されているカラー空間によっては、HDR 可能な (例えば RGBM エンコード) テクスチャにデコードする方法についての情報を持つ。UnityCG.cginc シェーダーincludeファイルの DecodeHDR
関数を参照してください。
リニアカラー空間を使用するとき、すべてのマテリアルカラープロパティーは sRGB カラーで提供されます。しかし、シェーダーに渡されるときにリニアの値に変換されます。
例えば、プロパティー シェーダーブロックが “MyColor“ というカラー
プロパティーを含む場合、対応する ”MyColor” HLSL 変数はリニアカラーの値を取得します。
Float
または Vector
型として指定されているプロパティーには、カラー空間変換はデフォルトで行われません。それらには、カラーデータは含まれていないと仮定されるからです。カラー(プロパティーを参照)とまったく同様に、Float または Vector 型のプロパティーに [Gamma]
属性を加えて、それが sRGB 空間に指定されていることを示すことが可能です。