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 空間に指定されていることを示すことが可能です。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.