LoginSignup
34
25

More than 5 years have passed since last update.

【Unity】シェーダプロパティアトリビュートまとめ

Posted at

あまりまとまっているところがなかったので備忘録を兼ねてまとめました

シェーダプロパティアトリビュートってなに?

プロパティに追加の属性を付加できるもの
主にはマテリアルのインスペクタエディタを拡張できたり、GPUに対して追加で情報を付加できます

HideInInspector

c#レイヤーで毎度おなじみHideInInspector
インスペクタ上からプロパティを隠すことができます
主にコードから弄るプロパティに対して付加します

hoge.shader
Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    [HideInInspector]_Hoge ("HogeValue", int) = 0
    _Fuga ("FugaValue", int) = 0
}

image.png

NoScaleOffset

テクスチャデータ形式(3D/2D/Cube)のtiling/offset欄を非表示にします

hoge.shader
Properties
{
    [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
    _Hoge ("HogeValue", int) = 0
    _Fuga ("FugaValue", int) = 0
}

image.png

Normal

テクスチャデータ形式(3D/2D/Cube)にノーマルマップ以外のテクスチャが指定された場合警告が表示されます
警告内のFixNowを押すと選択されたテクスチャがノーマルマップ指定になります

hoge.shader
Properties
{
    [Normal]_MainTex ("Texture", 2D) = "white" {}
    _Hoge ("HogeValue", int) = 0
    _Fuga ("FugaValue", int) = 0
}

image.png

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)のように記述すれば指定することが可能です

hoge.shader
_MainTex ("Texture", 2D) = "white" {}
[Toggle]_Hoge ("HogeValue", int) = 0
[Toggle(FUGA_ENABLE)]_Fuga ("FugaValue", Float) = 0

image.png

Enum

データ形式がInt/Floatの場合に利用できます。インスペクタ上にプルダウンリストを表示します。
列挙する値を指定の仕方はオプションにFoo,2,Bar,4のような記述をするとFoo時は2,Bar時は4が設定されることになります。
また、C#上のenum値を指定することが可能でその場合はオプションにNameSpace.EnumNameのような記述をします

hoge.shader
Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    [Enum(Foo,2,Bar,4)]_Hoge ("HogeValue", int) = 0
    [Enum(Product.TestEnum)]_Fuga ("FugaValue", Float) = 0
}
TestEnum.cs
namespace Product
{
    public enum TestEnum
    {
        Foo,
        Bar
    }
}

image.png

KeywordEnum

基本的にはEnumと同じですがKeywordEnumの場合は選択された対象名のキーワードが有効になります。
例えば[Enum(Foo,Bar)]_Hoge ("HogeValue", int) = 0と定義した場合、Fooの場合は_HOGE_FOO, Barの場合は_HOGE_BARのキーワードが有効になります。

PowerSlider

データ形式がRangeに対してのみ使えます。オプションに値を設定することでインスペクタ上のスライダーを指数関数的にすることができます。なおオプション値に1を指定すると通常のRangeと同様の状態になります

Hoge.shader
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
}

image.png

34
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
25