ツクロウヤ

Unityによるゲーム開発記

【シェーダー勉強④】Propertiesについて

はじめに

今回は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

f:id:ArtAwA:20200830181548p:plain

Float

浮動小数点を定義する型。

name("display name", Float) = number

// 例
_Float("Float", Float) = 0

f:id:ArtAwA:20200830182126p:plain

Range

範囲で浮動小数点を定義する型。
マテリアルのInspectorにminが最小値、maxが最大値のスライダーが表示されます。

name("display name", Range(min, max)) = number

// 例
_Range("Range", Range(0.0, 1.0)) = 0.0

f:id:ArtAwA:20200830182146p:plain

Color

色を定義する型。
(r,g,b,a)の値を0~1で設定。

name("display name", Color) = (number,number,number,number)

// 例
_Color("Color", Color) = (1,1,1,1)

f:id:ArtAwA:20200830200110p:plain

Vector

4つの浮動小数点を定義する型。

name("display name", Vector) = (number,number,number,number)

// 例
_Vector("Vector", Vector) = (1,1,1,1)

f:id:ArtAwA:20200830182209p:plain

2D

テクスチャを定義する型。
初期値に"white""black"を宣言することによって、
Unity標準の真っ白の画像(white)、真っ黒の画像(black)を割り当てることが可能です。

name("display name", 2D) = "defaultTexture" {}

// 例
_Texture("2D Texture", 2D) = "white" {}

f:id:ArtAwA:20200830182220p:plain

Cube

キューブマップを定義する型。
キューブマップは周囲の環境のリフレクションを表現する正方形テクスチャが 6 つで一組になったもの。
キューブマップをUnityで作成する場合は「Assets > Create > Legacy > Cubemap」で可能です。

name("display name", Cube) = "defaultTexture" {}

// 例
_CubeMap("CubeMap", Cube) = "white" {}

f:id:ArtAwA:20200830182749p:plain

3D

3Dテクスチャを定義する型。 3Dテクスチャはスクリプトでのみ生成可能です。

name("display name", 3D) = "defaultTexture" {}

// 例
_3DTexture("3D Texture", 3D) = "white" {}

f:id:ArtAwA:20200830183242p:plain

2DArray

2Dテクスチャを配列で定義する型。
2Dテクスチャ配列はスクリプトでのみ生成可能です。
シェーダーでプロパティを参照する際は別途処理の定義が必要です。 (今回は取り扱いません)

name("display name", 2DArray) = "defaultTexture" {}

// 例
_2DArray("2D Array", 2DArray) = "white" {}

f:id:ArtAwA:20200830183947p:plain

プロパティアトリビュート

プロパティアトリビュートを宣言することで、プロパティの属性やInspectorでどのような表示を行うかが設定可能です。
プロパティアトリビュートは宣言しなくも大丈夫です。
(使い道がいまいち分かっていない項目(HDR,Gammaなど)はスルーします...)

HideInInspector

マテリアルのInspectorにプロパティを表示しないためのもの。
定数や2DArrayなどコードからプロパティを設定する際などに設定します。

[HideInInspector]

// 例
[HideInInspector] _2DArray("2DArray", 2DArray) = "white" {}

NoScaleOffset

テクスチャプロパティのマテリアルのInspectorに「Tiling」「Offset」の定義を非表示にするもの。

[NoScaleOffset]

// 例
[NoScaleOffset] _NSOTexture("NoScaleOffset Texture", 2D) = "white" {}

f:id:ArtAwA:20200830185200p:plain

Normal

テクスチャプロパティが法線マップであることを示すもの。
法線マップ以外が設定されると警告が表示されます。

[Normal]

// 例
[Normal] _NormalMap("_Normal Map", 2D) = "white" {}

f:id:ArtAwA:20200830185908p:plain

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 

f:id:ArtAwA:20200830191440p:plain

シェーダーキーワードとは
シェーダーコードの一部を有効/無効に切り替えたりする場合に使用するもの。
シェーダー内で定義(#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

f:id:ArtAwA:20200830192312p:plain

KeywordEnum

Float型をInspector上でポップアップメニューとして表示して、対応するシェーダーキーワードを有効化します。
Enumでは値が設定されますが、KeywordEnumでは「大文字のプロパティ名+"_"+列挙体名」のキーワードが有効になります。
最大で9つまで設定可能。

[KeywordEnum(Value1, Value2, ...)]

// 例
// ↓の場合 _OVERLAY_NONE, _OVERLAY_ADD, _OVERLAY_MULTIPLY のいづれかのシェーダーキーワードがセット
[KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0

f:id:ArtAwA:20200830192604p:plain

PowerSlider

Range シェーダープロパティに対する線形でない反応曲線のスライダーを表示。
例えば二次曲線のようにスライダーの左側の値は小さく、右に行くほど変化量が大きくなるような形。
表示としては通常のRangeと同じ。

[PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08

f:id:ArtAwA:20200830194529p:plain

IntRange

Rangeシェーダープロパティで整数スライダーを表示。 入力される値が整数に補間される。

[IntRange] _Alpha ("Alpha", Range (0, 255)) = 100

f:id:ArtAwA:20200830195023p:plain

Space

シェーダープロパティの前に垂直方向のスペースを挿入する。

[Space]
[Space(30)]

// 例
[Space(30)]_Float("Float", Float) = 0

f:id:ArtAwA:20200830195256p:plain

Header

シェーダープロパティの前にヘッダーテキストを挿入する。
挿入するテキストは「""」では囲まない。

[Header(display name)]

// 例
[Header(Values)]_Int("Int", Int) = 0

f:id:ArtAwA:20200830195607p:plain

参考文献

ShaderLab: Properties - Unity マニュアル
UnityEditor.MaterialPropertyDrawer - Unity スクリプトリファレンス
Cg/HLSL でシェーダープロパティーを参照する - Unity マニュアル
Cubemaps - Unity マニュアル
3D textures - Unity マニュアル
Using texture arrays in shaders - Unity マニュアル