はじめに
UnityのLinearワークフローとGammaワークフローについて、軽くまとめてみようと思います。
環境
Unity2020.2.0f1
Universal RP 10.2.2
問題
突然ですが、ここで問題です。
フラグメントシェーダーで 0.5 ( RGB = (128, 128, 128 ) ) という色を返した場合、
画面にはどんな色が表示されるでしょうか? (Linearワークフロー)
fixed4 frag (v2f i) : SV_Target { return 0.5; }
答え
RGB = (188, 188, 188) が表示されます。(明るく表示されます)
表示色が異なる理由はLinearワークフローにあります。
Linearワークフロー
通常のUnityでは、Linearワークフローが採用されており、以下のような計算を行います。
- シェーダー内では色の計算をLinear空間で行う
- 計算結果はガンマ補正してから画面に表示する
sRGBテクスチャが画面に表示されるまで (Linearワークフロー)
sRGBテクスチャが画面に表示される流れは以下のようになります。
1. sRGBテクスチャはサンプリング時にLinear色空間へ変換される (逆ガンマ補正)
2. シェーダーではLinear色空間で計算を行う
3. 色の計算結果はsRGB色空間へ変換してから画面に表示する(ガンマ補正)
sRGBテクスチャとLinearテクスチャの切り替え
テクスチャは、デフォルトではsRGBにチェックが入った状態になっています。
sRGBのチェックが入っていると、そのテクスチャはsRGB色空間にあるものとして扱われます。
テクスチャのsRGBのチェックを外すと、Linear色空間のテクスチャとして扱われるようになります。
Linearテクスチャが画面に表示されるまで (Linearワークフロー)
Linear色空間のテクスチャは、テクスチャサンプリング時に逆ガンマ補正がかからなくなります。
画面に表示される際にはガンマ補正がかかります。
結果として、テクスチャは明るく表示されるようになります。
Linearワークフロー と Gammaワークフローの切り替え
UnityのPlayerSettingsには Color Space という設定項目があります。
ここがLinearの場合、UnityはLinearワークフローでレンダリングを行うようになります。
Gammaだと、UnityはGammaワークフローでレンダリングを行うようになります。。
Gammaワークフロー
Gammaワークフローでは、色が画面にそのまま表示されるようになります。(Linearワークフローだとガンマ補正がかかっていました)
テクスチャが画面に表示されるまで (Gammaワークフロー)
Gamma ワークフローでは、テクスチャの色はそのままシェーダーに取り込まれ、シェーダーの計算結果もそのまま画面に表示されます。
まとめ
- Linearワークフローでは、ガンマ補正や逆ガンマ補正が入る
- Gammaワークフローでは、ガンマ補正や逆ガンマ補正は入らない