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 空間に指定されていることを示すことが可能です。