シェーダーセマンティクス
頂点プログラムへ頂点データの流し込み

Cg/HLSL でシェーダープロパティーを参照する

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 変数タイプとの対応は次のようにマッピングされます。

  • Color と Vector のプロパティーは float4, half4 または fixed4 変数にマップされています。
  • Range と Float プロパティーは float, half または fixed 変数にマップされています。
  • Texture プロパティーは、通常( 2D )のテクスチャの場合は__sampler2D__変数に、キューブマップの場合は samplerCUBE に、3D テクスチャの場合は__sampler3D__変数にマップされています。

プロパティー値がどのようにシェーダーに渡されるか

シェーダープロパティー値は以下の場所にあり、シェーダーに渡されます。

  • MaterialPropertyBlock に設定されたレンダラーごとの値。これは、一般的に 「インスタンスごとの」データ (例えば、同じマテリアルを共有する多数のオブジェクトに使用するカスタム化した色)です。
  • レンダーしたオブジェクトに使用するマテリアルに設定された値。
  • Unity のレンダリングコード自体 (ビルトインのシェーダー変数を参照) か、ユーザー自身のスクリプト (例えば、Shader.SetGlobalTexture) のいずれかによって設定されたグローバルシェーダープロパティー。

優先順位は上記で述べたとおりです。インスタンスごとのデータは、すべてをオーバーライドします。その次に、マテリアルデータが使用されます。最後に、その 2つの場所にシェーダープロパティーがない場合は、グローバルプロパティーの値が使用されます。もし、シェーダープロパティー値がどこにも宣言されていない場合は、「デフォルト」値 (float型には 0、カラーには黒、テクスチャには空の白いテクスチャ) が設定されます。

シリアライズされたランタイムマテリアルプロパティー

マテリアルは、シリアライズされ、かつランタイムに設定されるプロパティー値を含みます。

シリアライズされたデータはすべて、シェーダーの プロパティーブロックで宣言されたプロパティーです。一般的に、これらの値はマテリアルに保管する必要があり、マテリアルインスペクターでユーザーが調整することが可能です。

マテリアルには、シェーダーに使用されているにもかかわらず、シェーダーの プロパティーブロックでは宣言されないプロパティーが含まれることもあります。一般的に、これはランタイムにスクリプトコードから設定される (例えば Material.SetColor 経由で) プロパティーです。マトリクスと配列は、(決してプロパティーブロックでこれらを定義できないため)、シリアライズなしのランタイムプロパティーとしてだけ存在することに注意してください 。

特別なテクスチャプロパティー

シェーダー、または、マテリアルプロパティーとして設定されるそれぞれのテクスチャに対し、Unity では付加的なベクトルプロパティーで追加情報を設定することも可能です。

テクスチャの Tiling と Offset

マテリアルには、しばしばテキストプロパティーに 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 が含まれます

テクスチャ HDR パラメーター

{TextureName}_HDR - float4 プロパティー。使用されているカラー空間によっては、HDR 可能な (例えば RGBM エンコード) テクスチャにデコードする方法についての情報を持つ。UnityCG.cginc シェーダーincludeファイルの DecodeHDR 関数を参照してください。

カラー空間と、カラー/ベクトルシェーダーデータ

リニアカラー空間を使用するとき、すべてのマテリアルカラープロパティーは sRGB カラーで提供されます。しかし、シェーダーに渡されるときにリニアの値に変換されます。

例えば、プロパティー シェーダーブロックが “MyColor“ というカラープロパティーを含む場合、対応する ”MyColor” HLSL 変数はリニアカラーの値を取得します。

Float または Vector 型として指定されているプロパティーには、カラー空間変換はデフォルトで行われません。それらには、カラーデータは含まれていないと仮定されるからです。カラー(プロパティーを参照)とまったく同様に、Float または Vector 型のプロパティーに [Gamma] 属性を加えて、それが sRGB 空間に指定されていることを示すことが可能です。

参照

シェーダーセマンティクス
頂点プログラムへ頂点データの流し込み