はじめに
今回はShaderLabの「Properties」についてまとめていきたいと思います。
「Properties」はマテリアルのInspector上で設定する「カラー」「テクスチャ」「数値」などのプロパティを定義します。
構文
Propertiesは以下のような構文でプロパティを定義することが出来ます。
Properties { Propery1 Propery2 : }
Propertiesの各プロパティは以下の構文で記載します。
[プロパティアトリビュート] プロパティ名("表示名", 型宣言) = 初期値 // 例 [NoScaleOffset] _Texture("Texture", 2D) = "white" {}
プロパティ名
シェーダーから参照するプロパティの名前。
この名前で保存されているため、別のシェーダーにテクスチャの設定などを使い回す場合は同じ名前にする。
表示名
マテリアルのInspectorに表示する名前。
初期値
プロパティの初期値、必ず設定が必要。
型宣言
プロパティが数値や浮動小数点、テクスチャなど、どのようなデータか示すもの。
以下のような型があります。
Int
整数を定義する型。
name("display name", Int) = number // 例 _Integer("Integer", Int) = 0
Float
浮動小数点を定義する型。
name("display name", Float) = number // 例 _Float("Float", Float) = 0
Range
範囲で浮動小数点を定義する型。
マテリアルのInspectorにminが最小値、maxが最大値のスライダーが表示されます。
name("display name", Range(min, max)) = number // 例 _Range("Range", Range(0.0, 1.0)) = 0.0
Color
色を定義する型。
(r,g,b,a)の値を0~1で設定。
name("display name", Color) = (number,number,number,number) // 例 _Color("Color", Color) = (1,1,1,1)
Vector
4つの浮動小数点を定義する型。
name("display name", Vector) = (number,number,number,number) // 例 _Vector("Vector", Vector) = (1,1,1,1)
2D
テクスチャを定義する型。
初期値に“white”や“black”を宣言することによって、
Unity標準の真っ白の画像(white)、真っ黒の画像(black)を割り当てることが可能です。
name("display name", 2D) = "defaultTexture" {} // 例 _Texture("2D Texture", 2D) = "white" {}
Cube
キューブマップを定義する型。
キューブマップは周囲の環境のリフレクションを表現する正方形テクスチャが 6 つで一組になったもの。
キューブマップをUnityで作成する場合は「Assets > Create > Legacy > Cubemap」で可能です。
name("display name", Cube) = "defaultTexture" {} // 例 _CubeMap("CubeMap", Cube) = "white" {}
3D
3Dテクスチャを定義する型。
3Dテクスチャはスクリプトでのみ生成可能です。
name("display name", 3D) = "defaultTexture" {} // 例 _3DTexture("3D Texture", 3D) = "white" {}
2DArray
2Dテクスチャを配列で定義する型。
2Dテクスチャ配列はスクリプトでのみ生成可能です。
シェーダーでプロパティを参照する際は別途処理の定義が必要です。
(今回は取り扱いません)
name("display name", 2DArray) = "defaultTexture" {} // 例 _2DArray("2D Array", 2DArray) = "white" {}
プロパティアトリビュート
プロパティアトリビュートを宣言することで、プロパティの属性やInspectorでどのような表示を行うかが設定可能です。
プロパティアトリビュートは宣言しなくも大丈夫です。
(使い道がいまいち分かっていない項目(HDR,Gammaなど)はスルーします…)
HideInInspector
マテリアルのInspectorにプロパティを表示しないためのもの。
定数や2DArrayなどコードからプロパティを設定する際などに設定します。
[HideInInspector] // 例 [HideInInspector] _2DArray("2DArray", 2DArray) = "white" {}
NoScaleOffset
テクスチャプロパティのマテリアルのInspectorに「Tiling」「Offset」の定義を非表示にするもの。
[NoScaleOffset] // 例 [NoScaleOffset] _NSOTexture("NoScaleOffset Texture", 2D) = "white" {}
Normal
テクスチャプロパティが法線マップであることを示すもの。
法線マップ以外が設定されると警告が表示されます。
[Normal] // 例 [Normal] _NormalMap("_Normal Map", 2D) = "white" {}
Toggle
Float型をInspector上でトグルとして表示。
プロパティの値はoff=0, on = 1になります。
有効である場合はシェーダーキーワードで「大文字のプロパティ名+”_ON”」、または明示的に指定されたシェーダーキーワードがセットされます。
// (KEY)は省略可 [Toggle(KEY)] // 例 // ↓の場合はシェーダーキーワードに「_TOGGLE_ON」がセット [Toggle] _Toggle("Toggle", Float) = 0 // ↓の場合シェーダーキーワードに「_KEY」がセット [Toggle(_KEY)] _Toggle("Toggle", Float) = 0
シェーダーキーワードとは
シェーダーコードの一部を有効/無効に切り替えたりする場合に使用するもの。
シェーダー内で定義(#prafma multi_compile)と処理の分岐(#ifdef/#endif)することによって切替が可能です。
// 定義 #pragma multi_compile _TOGGLE_ON fixed4 frag (v2f i) : SV_Target { // 処理の分岐 #ifdef _TOGGLE_ON return fixed4(0,0,0,0); #else return fixed4(1,1,1,1); #endif }
Enum
Float型をInspector上でポップアップメニューとして表示。
列挙型(Enum)の型名や(明示的な名前, 値)で指定出来ます。
プロパティには対応するEnumの値が設定されます。
最大で7つまで設定可能。
[Enum(EnumType)] [Enum(Value1, 1, Value2, 2)] // 例 [Enum(UnityEngine.Rendering.BlendMode)] _Blend ("Blend mode", Float) = 1 [Enum(One,1,SrcAlpha,5)] _Blend2 ("Blend mode subset", Float) = 1
KeywordEnum
Float型をInspector上でポップアップメニューとして表示して、対応するシェーダーキーワードを有効化します。
Enumでは値が設定されますが、KeywordEnumでは「大文字のプロパティ名+”_”+列挙体名」のキーワードが有効になります。
最大で9つまで設定可能。
[KeywordEnum(Value1, Value2, ...)] // 例 // ↓の場合 _OVERLAY_NONE, _OVERLAY_ADD, _OVERLAY_MULTIPLY のいづれかのシェーダーキーワードがセット [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
PowerSlider
Range シェーダープロパティに対する線形でない反応曲線のスライダーを表示。
例えば二次曲線のようにスライダーの左側の値は小さく、右に行くほど変化量が大きくなるような形。
表示としては通常のRangeと同じ。
[PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08
IntRange
Rangeシェーダープロパティで整数スライダーを表示。
入力される値が整数に補間される。
[IntRange] _Alpha ("Alpha", Range (0, 255)) = 100
Space
シェーダープロパティの前に垂直方向のスペースを挿入する。
[Space] [Space(30)] // 例 [Space(30)]_Float("Float", Float) = 0
Header
シェーダープロパティの前にヘッダーテキストを挿入する。
挿入するテキストは「””」では囲まない。
[Header(display name)] // 例 [Header(Values)]_Int("Int", Int) = 0
参考文献
ShaderLab: Properties – Unity マニュアル
UnityEditor.MaterialPropertyDrawer – Unity スクリプトリファレンス
Cg/HLSL でシェーダープロパティーを参照する – Unity マニュアル
Cubemaps – Unity マニュアル
3D textures – Unity マニュアル
Using texture arrays in shaders – Unity マニュアル
コメント