【Unity】結局LinearとGammaどっちにしたらいいのかを考えてみた
はじめに
Unityを使っていると無意識のうちにColor SpaceをLinearにすることが多かったですが 「なんで?」とふと思ったのでドキュメントと自分の解釈を合わせて書いておこうと思います
間違ってたら教えて下さい
以前の記事で色についてちょっと勉強したことがあるので、
そんなに外れてはいないはず…
2020/07/10 現在の話です
ここを参考に話を進めます
以降、Unityにおけるリニア色空間は Linear、ガンマ色空間は Gamma 表記にします
結論
よっぽど古い端末、Unityだけで描画周りが完結しないみたいな制約がない限り、
""9割くらいはLinearにしておいたほうが安牌""っぽい
です
LinearとGamma ってなに
ここはUnityに限らずの話です
簡単に言えば、人間の目に見えやすくする補正をかけるのをガンマ補正と呼びます
(だいぶガバガバな説明です)
詳しく知りたいかたはこちらをどうぞ
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
テクスチャはガンマ色空間に保存される傾向がありますが、シェーダーはリニア色空間を前提としています。
なので、Gammaで使っているときに「なんか色が思ったより暗い」というのは Shader側が Gamma Texture を Linear Texture のように扱おうとしてしまっているのが原因だと思われます
じゃあLinearにするとどうなるのか というと
リニアカラー空間を使用するとき、すべてのマテリアルカラープロパティーは sRGB カラーで提供されます。しかし、シェーダーに渡されるときにリニアの値に変換されます。
のでユーザーから見ればLinearにしただけで治るケースが多いです
じゃあ Gammaで正しく使うにはどうするの という話ですが、
Color Space: Gamma モードで sRGB サンプリングを回避するよう設定できます。これを行うには、テクスチャの Inspector ウインドウ の sRGB (Color Texture) チェックボックスを無効にします。
なので使う側に一手間いる ということですね
「わかんないけどなんかsRGBのチェックを外すと治る」みたいなケースは
「デフォルト(Gamma)で使っており、Gammaが考慮されていないShaderを使っているため」が大体だと思われます
余談
Shader側でGamma想定のTextureがほしいときの対応もあるにはあるっぽい…?
[Gamma] - Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。
Textureも実質(?) Vectorなので効きそうな気もしますが未確認です
2020/07/10 21:30 追記
とても参考になる記事を見つけたので貼っておきます
自分でShaderを書いて対応する場合は参考になると思います
対応端末
これじゃあGamma辞めればいいじゃん!!という話になりますが、現実はそうもいかないケースがあります
プラットフォームの中には、ハードウェアがガンマ形式しかサポートしていないものもあります
まあこのご時世さすがに…そろそろ…ないでしょ…という気持ちはありますが…
特にAndroid端末は遭遇しがちだったりしますので各々のProjectで要確認ですね
まとめ
UnityにおけるLinearはGammaからのスムーズな移行を実現するためにこういった仕様になってるのかな~と思いました
実際ちゃんとカラーワークフローまで考慮して開発するケースはゴリゴリの映像作品とかになると思うのでそこまでちゃんとした知識はなくてもなんとかなると思います!
なにかあればTwitterの方にご連絡ください~