てんちょーの技術日誌

自分がつまづいたこととかメモ

【Unity】結局LinearとGammaどっちにしたらいいのかを考えてみた

はじめに

Unityを使っていると無意識のうちにColor SpaceをLinearにすることが多かったですが 「なんで?」とふと思ったのでドキュメントと自分の解釈を合わせて書いておこうと思います

間違ってたら教えて下さい
以前の記事で色についてちょっと勉強したことがあるので、
そんなに外れてはいないはず…
2020/07/10 現在の話です

ここを参考に話を進めます

docs.unity3d.com

以降、Unityにおけるリニア色空間は Linear、ガンマ色空間は Gamma 表記にします

結論

よっぽど古い端末、Unityだけで描画周りが完結しないみたいな制約がない限り、
""9割くらいはLinearにしておいたほうが安牌""っぽい

です

LinearとGamma ってなに

ここはUnityに限らずの話です
簡単に言えば、人間の目に見えやすくする補正をかけるのをガンマ補正と呼びます
(だいぶガバガバな説明です)   詳しく知りたいかたはこちらをどうぞ

qiita.com

Unityにおけるガンマ値は体感約2.2辺りで固定なので sRGB想定なんだと思います
P3とかどうなるんだ…という話はあるので厳密にはGammaよりsRGB( or Gamma(sRGB) etc... )の方が表記としては正しそうだなと思ってます

ガンマ値自体も約2.2固定ではないので…

Texture

特に意識せずPhotoShopなどで作成するとsRGBになると思います
なのでUnityで言うところのGamma Textureに当たります

余談

マスクとして作るTextureやPattern Texture、LUTなどはLinearにしたほうがキレイに出ると思います

厳密にやるならPhotoShop等で作業した後にLinearでTexture書き出しをしたほうがよさそうですが、大体はsRGBで作ってゲームエンジン上でsRGBのチェックボックスを外す でよさそうです

Shader

テクスチャはガンマ色空間に保存される傾向がありますが、シェーダーはリニア色空間を前提としています。

docs.unity3d.com

なので、Gammaで使っているときに「なんか色が思ったより暗い」というのは Shader側が Gamma Texture を Linear Texture のように扱おうとしてしまっているのが原因だと思われます

じゃあLinearにするとどうなるのか というと

リニアカラー空間を使用するとき、すべてのマテリアルカラープロパティーは sRGB カラーで提供されます。しかし、シェーダーに渡されるときにリニアの値に変換されます。

docs.unity3d.com

のでユーザーから見ればLinearにしただけで治るケースが多いです

じゃあ Gammaで正しく使うにはどうするの という話ですが、

Color Space: Gamma モードで sRGB サンプリングを回避するよう設定できます。これを行うには、テクスチャの Inspector ウインドウ の sRGB (Color Texture) チェックボックスを無効にします。

docs.unity3d.com

なので使う側に一手間いる ということですね
「わかんないけどなんかsRGBのチェックを外すと治る」みたいなケースは
「デフォルト(Gamma)で使っており、Gammaが考慮されていないShaderを使っているため」が大体だと思われます

余談

Shader側でGamma想定のTextureがほしいときの対応もあるにはあるっぽい…?

[Gamma] - Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。

docs.unity3d.com

Textureも実質(?) Vectorなので効きそうな気もしますが未確認です

2020/07/10 21:30 追記

とても参考になる記事を見つけたので貼っておきます
自分でShaderを書いて対応する場合は参考になると思います

light11.hatenadiary.com

対応端末

これじゃあGamma辞めればいいじゃん!!という話になりますが、現実はそうもいかないケースがあります

プラットフォームの中には、ハードウェアがガンマ形式しかサポートしていないものもあります

docs.unity3d.com

まあこのご時世さすがに…そろそろ…ないでしょ…という気持ちはありますが…
特にAndroid端末は遭遇しがちだったりしますので各々のProjectで要確認ですね

まとめ

UnityにおけるLinearはGammaからのスムーズな移行を実現するためにこういった仕様になってるのかな~と思いました

実際ちゃんとカラーワークフローまで考慮して開発するケースはゴリゴリの映像作品とかになると思うのでそこまでちゃんとした知識はなくてもなんとかなると思います!

なにかあればTwitterの方にご連絡ください~

https://twitter.com/shop_0761