Version: 2020.1
言語: 日本語
シェーダーセマンティクス
頂点プログラムへ頂点データの流し込み

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

シェーダーは Material プロパティを 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 空間に指定されていることを示すことが可能です。

関連項目

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