rn.log

備忘録など

【Unity】Linearワークフロー と Gammaワークフローについてまとめてみる

はじめに

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空間で行う
  • 計算結果はガンマ補正してから画面に表示する

f:id:r-ngtm:20210120235736p:plain
色はガンマ補正してから画面に表示する

sRGBテクスチャが画面に表示されるまで (Linearワークフロー)

sRGBテクスチャが画面に表示される流れは以下のようになります。
1. sRGBテクスチャはサンプリング時にLinear色空間へ変換される (逆ガンマ補正)
2. シェーダーではLinear色空間で計算を行う
3. 色の計算結果はsRGB色空間へ変換してから画面に表示する(ガンマ補正)

f:id:r-ngtm:20210121000255p:plain
sRGBテクスチャがスクリーンに表示されるまで

sRGBテクスチャとLinearテクスチャの切り替え

テクスチャは、デフォルトではsRGBにチェックが入った状態になっています。
sRGBのチェックが入っていると、そのテクスチャはsRGB色空間にあるものとして扱われます。

f:id:r-ngtm:20210121003421p:plain
sRGBのチェックが入っていると、sRGB色空間として扱われる

テクスチャのsRGBのチェックを外すと、Linear色空間のテクスチャとして扱われるようになります。

f:id:r-ngtm:20210121002928p:plain
sRGBのチェックを外すとLinear色空間として扱われる

Linearテクスチャが画面に表示されるまで (Linearワークフロー)

Linear色空間のテクスチャは、テクスチャサンプリング時に逆ガンマ補正がかからなくなります。
画面に表示される際にはガンマ補正がかかります。
結果として、テクスチャは明るく表示されるようになります。

f:id:r-ngtm:20210121002814p:plain
非sRGBテクスチャが画面に表示されるまで(Linearワークフロー)

Linearワークフロー と Gammaワークフローの切り替え

UnityのPlayerSettingsには Color Space という設定項目があります。

ここがLinearの場合、UnityはLinearワークフローレンダリングを行うようになります。

f:id:r-ngtm:20210121001007p:plain
Linearワークフロー

Gammaだと、UnityはGammaワークフローレンダリングを行うようになります。。

f:id:r-ngtm:20210121000837p:plain
Gammaワークフロー

Gammaワークフロー

Gammaワークフローでは、色が画面にそのまま表示されるようになります。(Linearワークフローだとガンマ補正がかかっていました)

f:id:r-ngtm:20210121004008p:plain
Gammaワークフローでは色がそのまま表示される

テクスチャが画面に表示されるまで (Gammaワークフロー)

Gamma ワークフローでは、テクスチャの色はそのままシェーダーに取り込まれ、シェーダーの計算結果もそのまま画面に表示されます。

f:id:r-ngtm:20210121001336p:plain
Gammaワークフロー

まとめ

  1. Linearワークフローでは、ガンマ補正や逆ガンマ補正が入る
  2. Gammaワークフローでは、ガンマ補正や逆ガンマ補正は入らない

Linearワークフロー

f:id:r-ngtm:20210121000255p:plain:w500
Linearワークフロー

Gammaワークフロー

f:id:r-ngtm:20210121001336p:plain:w500
Gammaワークフロー