リニアワークフロー入門 簡単な説明とその意義

リニアワークフローについて理解が浅かったのでまとめます。
リニアワークフローについては調べるとテレビの歴史的背景から人間の視覚の話まで色々とでてきますが、そういうの書くとわかりづらいので要点のみ。

  • リニアワークフローとはそもそも何なのか?
  • リニアワークフローを使わないと何が問題なのか?

要はこれがわかればいいわけです。

リニアワークフローとは何か?

テクスチャにはRGBがそれぞれ0〜1の値で格納されています。
ここで、RGBをすべて0.5にすると、輝度が0.5のグレーが得られるはずです。

しかし、このときにディスプレイに表示される輝度はおよそ0.22となり、0.5よりもずっと低い輝度値となります。
これは、ディスプレイに表示する前にはRGBを2.2乗する、という仕様から来ています。
歴史的背景などは参考サイトを参照していただくとして、ここではひとまずそういうものだと思ってください。

f:id:halya_11:20180206221356p:plain:w300

リニアワークフローを使わない場合は、シェーダで行う色の計算にはテクスチャの値、つまり2.2乗していない状態のRGBを使います。
これに対して、2.2乗した後の値、つまりディスプレイに表示される色空間に変換してから計算しようというのがリニアワークフローです。

使わないと何が問題なのか?

リニアワークフローを使わないとどんな問題が起こるのでしょうか?

これを考えるために、いま、ディスプレイに輝度0.22のグレーが表示されているとします。
この色の値を、同じ色を合成することにより2倍にすることを考えます。

期待する結果としては、0.22 + 0.22 = 0.44 の輝度のグレーが表示されればOKです。
しかし、前述のとおり、この0.22という値はテクスチャにはRGBそれぞれ0.5として書かれています。
そのため、従来のフローだと0.5 + 0.5 = 1.0と計算されてしまいます。

その後、これをディスプレイに表示する際に2.2乗しますが、1は何乗しても1なので、ディスプレイに表示される結果は輝度が1の白となります。
0.44という値を期待していたのに得られた結果が1という全く違う値となってしまいました。

f:id:halya_11:20180206223909p:plain

これに対してリニアワークフローでは、まずテクスチャの0.5という値を2.2乗することでディスプレイ上の値である約0.22を得ます。 その後、0.22 + 0.22 = 0.44という値を計算し、これを1/2.2乗することで、テクスチャの色空間に戻します。 この時点で値は約0.69になります。

最後に、ディスプレイにより出力される際にこの値に2.2乗されるため、最終的にディスプレイに表示される値は約0.44となります。

以上が、リニアワークフローを使わない場合に起こる問題とリニアワークフローによる解決の例です。

用語の説明

以上、直観的な理解のため用語をあまり使わずに説明しましたので、ここでリニアワークフローに関する用語をまとめておきます。

  • sRGB空間: 上述の説明でいうところのテクスチャの色空間のこと
  • リニア空間: 上述の説明でいうところのディスプレイの色空間のこと
  • ガンマ補正: リニア空間の値をsRGB空間の値に変換すること

(補足)ヒトの輝度認知

最後に一点補足です。

既述の通り、sRGB空間で輝度0.5のグレーはリニア空間では0.22の輝度になりました。 つまり、下記のようなグラデーションバーが表示されているとき、中央の色の輝度は約0.22であるということになります。

f:id:halya_11:20180206225229p:plain

しかし、我々の目にはこれは線形のグラデーションであるように見えます。 そしてその感覚は間違えてはいないようです。

線形に見える理由としては、人間の知覚自体がリニアではないからで、暗い部分に多くの諧調を持たせた方が知覚的にはリニアに見えるようになるそうです。
詳しくはリンク先をご覧ください(人任せ)。

technorgb.blogspot.jp

参考

mtazmi-lab.blogspot.jp

compojigoku.blog.fc2.com

物理ベースレンダリング -リニアワークフロー編 (1)- | Cygames Engineers' Blog