Unityにおけるリニアワークフロー / リニアとガンマのレンダリング設定の違い
Happy Elementsカカリアスタジオのプログラマです。
この投稿はカカリアスタジオのAdvent Calendar 2019の12月8日の記事となります。
※ カカリアスタジオは京都にあるHappy Elementsのスタジオで、あんさんぶるスターズ、メルクストーリア、ラストピリオドなどを開発、運営しています。
カカリアスタジオでは、開発にUnityを用いています。
今回、記事を書く機会をいただいたので、Unityの機能について何か書こうと考えました。
本記事では、Unityのリニアとガンマのレンダリング設定に注目し、この違いについて話をしたいと思います。
はじめに
近年、リニアワークフローという言葉を耳にするようになりました。
Unityでも、PlayerSettingsからColorSpaceをLinearかGammaかを選べるようになっています。これがリニアワークフローを行うか否かの設定ということになります。
そもそもこの設定項目のリニア・ガンマの違いは何か、皆さんご存知でしょうか?
マニュアルや文献を見ても、雲を掴むような話に感じられるような方も多いのではないでしょうか?少なくとも、自分もそのように感じていました。
今回の記事では、その謎を追っていこうと思います。
実際に自分で手を動かしてみないと分からないのでは、というところもあったので、デジカメを使って写真を撮影して、撮影した写真のガンマ値を操作してみるという試みを行いました。
なぜデジカメを使うかというと、デジカメにはRaw撮影というモードがあり、これをつかうと、補正を挟むことのない画像を簡単に作ることができるからです。
この記事では、まず、デジカメのRaw撮影を用いて、ガンマとは何かを明らかにしてみたいと思います。
つぎに、Unityのこのレンダリングの設定をリニア・ガンマと切り替えて、どのような違いが出るかを確認します。
準備
今回はカメラはiPhone7で、Raw撮影可能なカメラアプリを使って撮影しました。
現像はdcrawというコマンドで行いました。
他にも様々な現像ソフトがありますので、興味がありましたら試してみてください。最初はrawtherapeeというソフトで現像しようとしたのですが、設定が複雑すぎて思うような結果にならなかったので諦めました。
以下、Rawデータ(DNG)を現像するコマンドです。
ex. ガンマ1で現像
dcraw -v -w -H 0 -o 1 -q 3 -4 -T IMG_0025.DNG
ex. ガンマ2.4で現像
dcraw -v -w -H 0 -o 1 -q 3 -g 2.4 12.9 -6 -T IMG_0025.DNG
結果
以下が結果になります。写真とそのヒストグラムを並べて表示させています。
ガンマ1で現像
ガンマ2.4で現像
JPEG撮影(デフォルトの撮影モード)
- ガンマ1とガンマ2.4を比較すると、ガンマ値があがるほど明るくなるということが分かりました。
- JPEG撮影されたものは、わたしたちが普段目にする写真です。これはガンマ1の写真とは大きく違うことがわかりました。ガンマ補正以外にも、ホワイトバランス調整など、様々な調整が入っているためかと思います。
- ガンマ2.4の写真とJPEG撮影された写真は、明るさの点だけ比較すれば、近いということも分かりました。ヒストグラムにも類似点があるかと思います。
少し補足
Unityでの検証に移る前に、上記の結果について少し補足しておきます。ガンマの値が1である=リニアである、ということになります。
また、普段私たちがディスプレイを通して見ている画像は、ガンマの値を2.4程度に調整されたものということになっています。レンダリング設定=リニアでは、乱暴に言ってしまえば、一旦ガンマ2.4の画像をガンマ1に処理をしてから、色を調整し、再度ガンマ変換をかけてから表示することをさしているはずです。
レンダリング設定=ガンマでは、ガンマ2.4の状態のまま、色を調整し、そのまま表示します。
ガンマ補正のグラフ
グラフだと分かりにくい気もするので、グラデーションの図も用意しました。
例えば、ガンマ1における入力0.4の値とガンマ2.4における入力0.1の値が、ほぼ同じくらいになることが分かるかと思います。
Unityでの検証
ガンマ値やUnityのLinear/Gammaの設定の意味をおさえたところで、次にUnityでの検証に入りたいと思います。
輝度を設定できるシェーダを作成し、GammaとLinear設定を変えて見た目の検証しました。
輝度調整については、さまざまな方法があるかと思います。
今回は、末尾に記載の資料を参考に、RGBを一旦HSVにして、Vを調整して、再度RGBに戻すという方法で検証しました。
見比べてみると、以下のようなことが分かりました。
- リニア設定の方が、ガンマ設定と比べると、輝度がなだらかに調整できていることが確認できました。
- 一番左は、ガンマ値1の状態ですが、その状態では、リニア設定でもガンマ設定でも同じ見た目になることも確認できました。
- 一番右は、白飛びするほど輝度が高い状態ですが、リニアのほうではガンマに比べて色が残っていると思います。
まとめ
いかがでしたでしょうか。
Unityのレンダリング設定のLinearとGammaについて話をさせていただきました。このリニアだガンマだという話は、人から聞いてもあまりピンと来ない部分でした。しかし今回、自分で手を動かして調べてみることで、理解が深まったと感じました。また、今回デジタルカメラを用いて検証しました。デジタルカメラは身近ですし、楽しく学べると感じました。
このUnityのレンダリング設定ですが、もし開発者間でLinearとGammaが混在するような設定をしてしまうなどすると、輝度が違って見えてまう、などのトラブルが起きてしまうかもしれません。
おや?自分のUnityのGameビューは他の人よりも明るすぎないだろうか?と感じたときは、ここの設定を疑ってみても良いのかもしれません。
どうでもいい話かもしれませんが、検証で利用した写真に写っている柿は、職場の同僚から頂戴致しました。実家で収穫されたものだそうです。
最後に
最後まで読んでいただき、ありがとうございました。
カカリアスタジオのAdvent Calendar 2019は12/25まで続きますので、引き続きご覧いただけますと幸いです。
https://adventar.org/calendars/4511
参考
記事を書くにあたって以下を参考にしました
- リニアワークフローについて
- Unityのマニュアル リニアのワークフローとガンマのワークフロー
- dcraw
- rawtherapee
- Dcrawでraw画像の現像を自動化
- dcraw - gamma tests - comparing linear RAW conversion with sRGB
- Unityでの検証時にMCUnitychanのモデルを利用させていただきました
- © Unity Technologies Japan/UCL https://unity-chan.com/
- RGBとHSVの相互変換