【Unity】テクスチャの色空間設定(sRGBチェックボックス)の意味と挙動まとめ

Unityにおけるテクスチャの色空間設定(sRGBチェックボックス)の意味と挙動をまとめました。

Unity2019.2.18

はじめに

Unityではテクスチャ毎に、格納されている値の色空間の設定を行うことができます。
テクスチャ設定のsRGB(Color Texture)がこれにあたります。

f:id:halya_11:20200121164324p:plain

ガンマのワークフローで作業する場合にはこの設定値は意識することが無いと思いますが、
リニアワークフローを使う場合にはきちんと挙動を理解する必要があります。

そこでこの記事ではテクスチャと色空間の関係についてまとめます。

なお、本記事の内容はリニアワークフローの基礎知識があることを前提としています。
これに関しては以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

テクスチャと色空間

さて、テクスチャのInspectorを見るとsRGB(Color Texture)という設定項目が存在します。

f:id:halya_11:20200121164324p:plain

これにチェックをすると、「このテクスチャにはsRGB色空間の値が格納されている」と解釈されます。
よって、色空間をガンマに設定している場合は格納された値がそのまま使われます。
これに対して色空間をリニアに設定している場合は格納された値がシェーダに渡される際にリニアライズされます。

普通に(初期設定で)Photoshopなどでテクスチャに色を塗ったらsRGBの値がテクスチャに格納されます。
したがって、色を表すテクスチャのインポート設定では基本的にsRGBにチェックを入れます。
アルベドの値をテクスチャに描きこむ場合も、下記のようにアルベドをsRGBに変換したものを描きこんでおいて使うのがよさそうです。
(シェーダプロパティとして色を入力する際も入力はsRGB空間で行い、シェーダに渡る際にリニア空間に変換されます)

docs.unity3d.com

これに対してノーマルマップやラフネスマップなど、テクスチャに格納されている値を
そのままシェーダで使いたい場合にはsRGBのチェックを外します。

sRGBのチェックを外した場合、「このテクスチャにはリニア色空間の値が格納されている」と解釈されます。
このケースではリニア設定の場合もガンマ設定の場合も格納された値がそのままシェーダに渡されます。

RenderTextureと色空間

さてこのような色空間の設定はRenderTextureにも存在します。
RenderTextureの場合、コンストラクタの引数でRenderTextureReadWriteを設定することで色空間を設定します。

docs.unity3d.com

これをsRGBに設定すると、「このRenderTextureにはsRGB色空間の値が格納されている」と解釈されます。
したがってリニアワークフローではシェーダでサンプリングする際に格納された値がリニア変換されます。

さらにRenderTextureの場合は書き込みを考える必要もあります。
リニアワークフローでは、RenderTextureにデータを書きこむ際にシェーダの結果値が内部的にリニアの値からsRGBに変換されます。

これに対して法線など、色出ない値をRenderTextureに格納する場合にはRenderTextureReadWriteをLinearに設定します。
この場合には色空間の設定にかかわらず、読み込み・書き込みいずれの際にも変換は行われません。

参考

docs.unity3d.com

docs.unity3d.com

関連

light11.hatenadiary.com