あまりまとまっているところがなかったので備忘録を兼ねてまとめました
シェーダプロパティアトリビュートってなに?
プロパティに追加の属性を付加できるもの
主にはマテリアルのインスペクタエディタを拡張できたり、GPUに対して追加で情報を付加できます
HideInInspector
c#レイヤーで毎度おなじみHideInInspector
インスペクタ上からプロパティを隠すことができます
主にコードから弄るプロパティに対して付加します
Properties
{
_MainTex ("Texture", 2D) = "white" {}
[HideInInspector]_Hoge ("HogeValue", int) = 0
_Fuga ("FugaValue", int) = 0
}
NoScaleOffset
テクスチャデータ形式(3D
/2D
/Cube
)のtiling/offset欄を非表示にします
Properties
{
[NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
_Hoge ("HogeValue", int) = 0
_Fuga ("FugaValue", int) = 0
}
Normal
テクスチャデータ形式(3D
/2D
/Cube
)にノーマルマップ以外のテクスチャが指定された場合警告が表示されます
警告内のFixNow
を押すと選択されたテクスチャがノーマルマップ指定になります
Properties
{
[Normal]_MainTex ("Texture", 2D) = "white" {}
_Hoge ("HogeValue", int) = 0
_Fuga ("FugaValue", int) = 0
}
HDR
テクスチャデータ形式(3D
/2D
/Cube
)に選択されたテクスチャがHDRテクスチャであることを示します
Gamma
リニアカラー空間を使う場合、Color
プロパティについてはsRGBで提供されシェーダで渡される時にリニアカラーに変換されます。
Float
/Vector
についてはカラーデータかどうかはUnityから検知することはできないので明示的にGamma
アトリビュートを付与することによりカラー変換が適用されるようになります。
PerRendererData
テクスチャデータ形式(3D
/2D
/Cube
)に使用でき、対象のデータはMaterialPropertyBlock
クラス
のインスタンス値で初期化されます。主にテクスチャデータを動的にスクリプトからセットする場合に使われます。
インスペクタ上ではHideInInspector
同様非表示になります。
Toggle
データ形式がInt
/Float
の場合に利用できます。インスペクタ上で対象のプロパティがチェックボックスに変わりオンの時は1
、オフの時は0
となります。
また、トグルがオンの時はコンパイル時(プロパティ名の大文字)_ON
のキーワードが有効になります。このキーワードは#ifdef
などのプリプロセッサで使えます。(キーワードを利用するためには multi_compile指定が必要です
キーワード名を指定したい場合がToggle(KEYWORD_NAME)
のように記述すれば指定することが可能です
_MainTex ("Texture", 2D) = "white" {}
[Toggle]_Hoge ("HogeValue", int) = 0
[Toggle(FUGA_ENABLE)]_Fuga ("FugaValue", Float) = 0
Enum
データ形式がInt
/Float
の場合に利用できます。インスペクタ上にプルダウンリストを表示します。
列挙する値を指定の仕方はオプションにFoo,2,Bar,4
のような記述をするとFoo
時は2,Bar
時は4が設定されることになります。
また、C#上のenum値を指定することが可能でその場合はオプションにNameSpace.EnumName
のような記述をします
Properties
{
_MainTex ("Texture", 2D) = "white" {}
[Enum(Foo,2,Bar,4)]_Hoge ("HogeValue", int) = 0
[Enum(Product.TestEnum)]_Fuga ("FugaValue", Float) = 0
}
namespace Product
{
public enum TestEnum
{
Foo,
Bar
}
}
KeywordEnum
基本的にはEnumと同じですがKeywordEnum
の場合は選択された対象名のキーワードが有効になります。
例えば[Enum(Foo,Bar)]_Hoge ("HogeValue", int) = 0
と定義した場合、Fooの場合は_HOGE_FOO
, Barの場合は_HOGE_BAR
のキーワードが有効になります。
PowerSlider
データ形式がRangeに対してのみ使えます。オプションに値を設定することでインスペクタ上のスライダーを指数関数的にすることができます。なおオプション値に1
を指定すると通常のRangeと同様の状態になります
Properties
{
[PowerSlider(0.5)]_PosX ("PositionX", Range(0.01, 1)) = 0
_PosY ("PositionY", Range(0.01, 1)) = 0
[PowerSlider(2.0)]_PosZ ("PositionZ", Range(0.01, 1)) = 0
}