概略
Unity の Shader Property は Color を持つことができる 。また [HDR] Attribute を付与することで HDR Color の指定もできる。
しかしこれらの Color Property が実際にどのような値で保存され、Inspector 上で表示され、そしてどういった値としてシェーダに渡されるのかは詳細には書かれていない。
本記事ではその点を明らかにする。
結論
表で結論を示す。
| プロパティ | Material に記録される値 | Inspector 上の見た目 | Shader に渡される値 (Linear ColorSpace) |
|---|---|---|---|
| 通常の RGB チャンネル | 0.5 [sRGB] | 0.5 [sRGB] | 0.217 [Linear] |
| HDR の RGB チャンネル | 0.5 [Linear] | 0.73 [sRGB] | 0.5 [Linear] |
| Alpha チャンネル | 0.5 [Linear] | バーの半分 | 0.5 [Linear] |
通常の RGB チャンネル
[HDR] Attribute の付いていない普通の Color Property は sRGB 空間の値を格納することを目的としている。
したがって Inspector 上で #808080 の sRGB ハーフグレイを指定すると 0.5 [sRGB] という値がそのまま記録される。
また Inspector 上における色のプレビューも、人間の直感的に中間色に近い sRGB ハーフグレイとなる。
そして Linear ColorSpace 設定のプロジェクトの場合 0.5 [sRGB] を sRGB2Linear 変換した 0.217 [Linear] の値がシェーダに渡される。
[HDR] Attribute の RGB チャンネル
[HDR] Attribute の付いた Color Property は HDR な Linear 空間の値を格納することを目的としている。
したがって Inspector 上で HSV = (0, 0, 50) を指定すると 0.5 [Linear] という値がそのまま記録される。
また Inspector 上における色のプレビューは sRGB ハーフグレイより明るめのグレイが表示される。これは 0.5 [Linear] を Linear2sRGB 変換した 0.73 [sRGB] だ。
ここで 1 点注意すべきなのは HDR Color のカラーパレットにおける #808080 は sRGB ハーフグレイではなく Linear 空間の 0.5 になるということだ。
この仕様は正直どうなのだろうかとは思う。
そして Linear ColorSpace 設定のプロジェクトの場合、値は無変換のまま 0.5 [Lienar] がシェーダに渡される。
Alpha チャンネル
アルファチャンネルは [HDR] Attribute の有無に関わらず Linear 空間の値が格納されている。
Inspector 上で 50% を指定すればそのまま 0.5 [Linear] の値が記録される。
そして Linear ColorSpace 設定のプロジェクトの場合、値は無変換のまま 0.5 [Linear] がシェーダに渡される。
さいごに
これらの仕様は Material を設定する側の人間は意識する必要はない。Shader を深く設計する必要のある人間だけが意識する必要のある挙動である。
通常は Inspector 上における色のプレビュー、そして最終的な描画結果をみて判断すると良いだろう。
ただ前述したように HDR Color のカラーパレット指定においては Web カラー指定(例 #808080 )が意図しない明るい色になってしまうということは覚えておくと便利だろう。