リニアワークフローとカラースペース覚書

<p><a href="https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%B3%E3%83%9E%E5%80%A4#/media/File:Gamma06_600.png"><img class="float" src="https://dl.dropbox.com/s/f745j1ssde7fief/Linear_Workflow.gif" alt="Wikipedia: ガンマ値" /></a></p>



## 色と光を区別する

従来は **【 色 】** の情報を使用してレンダリング・コンポジットを行っていたが、**【 色 】** ではなく **【 光 】** の量をテクスチャ・レイヤーとして出力し、レンダリング・コンポジットが終わった後に **【 光 】** を **【 色 】** に変換しよう、というワークフローのこと。

リニアライズとは非線形な色と光の関係を線形に、ようは色を光に変換する処理のこと。

以下メモ。



<!--more-->



Arnold、mental ray、V-Ray など、レンダラーはどの地点にどの程度光が届いているか、反射しているか、色ではなく光の量を計算している。

レンダリングされた画像はノーマルマップやポジションパス等と同様、画像ファイルに保存されてはいるが、意味的には中身は色情報ではなく光のデータ。
<small>※ ノーマルマップ等に比べれば絵に見えるので、そのまま絵として扱っていたのが従来の手法。</small>


光を扱うレンダラーにテクスチャなど色のデータをそのまま読み込んでレンダリングを行うと、光と色が混在したシーンをレンダラーが計算することになってしまう。


レンダラーが扱うデータを光に統一するためには、読み込むテクスチャを色の情報から光の情報に変換してやる必要がある。

その処理はリニアライズと呼ばれている。
<small>※ これとリニアワークフローという呼び方が話をややこしくしている気がする。</small>


色のデータをリニアライズし光の量に変換した上でレンダリングを行うことで、すべての計算が光で統一され、レンダリングをより正確に行うことが出来るようになる。

リニアライズはガンマ補正に似たような処理で、色が補正されたようではあるが、実際には色から撮影時の光の量を復元している。
<small>※ ガンマ補正 = 2.2 / 0.4545 などあくまで近似値で、実際はもう少し複雑らしい。</small>


リニアライズ処理された画像データは画像ビューアで表示すれば画像に見えるが、保存されている情報は色ではなく光のデータ。

リニアワークフローでレンダリングされた画像はリニアライズされたテクスチャ画像同様、光の量が保存されているデータであって、暗い絵がレンダリングされているわけではない。

最終的にディスプレイに表示する際には、光のデータを色の情報に変換してやる必要がある。


光から色へ変換する処理は、LUT、色変換、ODT、DDT、カラースペースなど様々な呼ばれ方をしている。



## カラースペース

カラースペースといっても色変換を表す場合と、色域をあらわす場合の二種類がある。


色変換・色域のどちらにも sRGB や Rec. 709 という用語が出てくるので、カラースペース云々の話を見聞きしていると、何が何を指しているのかが分からなくなって話がややこしくなる。



### 色域【Gamut】

まず色域。


これはハードウェアの性能・表示できる色を表す際に使用されるもので、sRGB 対応ディスプレイや Adobe RGB 対応プリンタ等と言う形で使われる。

色域と呼ばれるよりもカラースペースと呼ばれる事がほとんどだと思う。


新規格の ACES は基本、色域を表すもので、可視光線のすべてを含む色空間をサポートしているようなものらしい。

OpenColorIO に対応し ACES をサポートしている Blender / Nuke に、出力時のカラースペースとして sRGB や Rec. 709 があって ACES が無いのは、色変換ではなく色域の規格だからかと。



### 色変換 【LUT】

色変換、Look Up Table、これもカラースペースと呼ばれることがほとんどだと思う。

よくガンマ補正が～ といわれるもので、カラーエンコーディングなんて言い方もあるらしい。


色域と同じく sRGB や Rec. 709 という単語が出てくるが、前述の色域で使われている sRGB とはまったく別の意味を表す。ガンマ 2.2 とか、アンガンマ（デガンマ？） 0.4545 とか言われるものが色変換の sRGB。


色を光へ変換するリニアライズ処理は IDT (Input Device Transform)、光を色へと変換して、表示・出力する処理は ODT (Output Device Transform) または DDT (Display Device Transform) と呼ばれる。


カメラ・ディスプレイなどハードウェアごとの IDT はハードウェアベンダーが提供しているので、それらを使うことでガンマ補正による近似値よりも正確に変換することができる。



## リニアワークフローのメリット

リニアワークフローとメーカー提供の IDT を使用すると、光から色へと変換するというハードウェアに依存した部分から開放されるので、理論上ハードウェアごとのばらつきが無くなる。


コンポジットでは光物のエフェクトの合成などが、スクリーンではなく加算で合成してもらしくなる。


CGのレンダリングでは光の減衰が、より自然になる。



## CGをやる上であまり気にしなくてもよさそうなこと

ディスプレイ、カメラ、ガンマ云々、理由はともあれ光と色には非線形な関係があって、光量が2倍になったとしても撮影・表示される色の明るさが同じように2倍になるわけではない。


この光と色の関係性が、従来の手法での現実に近いライティング・コンポジット処理を不可能にしていた。


だったらその光と色の非線形な関係を、線形【リニア】に補正【リニアライズ】して作業すればいい、ということでリニアワークフローという名前に、おそらくはなった。


いわゆるガンマ値 = 2.2 というのは近似値で、実際にはもう少し複雑らしい。カメラ・ディスプレイによっても変わってくるらしい。


などなど。


これらの事は重力加速度 = 9.8 であることに疑問を持たない事と同様、物理学者でもなければ気にする必要はないと思う。

メーカーの作ったプリセットを、ただそういうものであると受け入れればいいと思う。


リニアワークフロー、sRGB、ガンマ 2.2 / 0.4545。



## Open EXR: ACES / Linear sRGB / Linear Rec. 709


Maya + mental ray には、Linear sRGB と Linear Rec. 709 という選択肢が Color Management にある。


レンダリング画像のデータを比較しても変化はなかった。
本来は Open EXR ファイルのヘッダやらタグ情報か何かが違うべきなんだと思う。


Blender の Open EXR は sRGB のタグ情報がついている？？
Nuke の Open EXR には Rec.709 のタグ情報がついている？？


というメモが残っていたが、どこで調べたかわからない。。。



----
※ 旧ブログから移転した投稿です。
> [リニアワークフローとカラースペース覚書](https://www.sator-imaging.com/2014/12/blog-post.html)
<iframe
    class="embed-card embed-webcard"
    scrolling="no"  frameborder="0"
    style="
        display: block;  border: none;
        margin: 10px 0px;
        width: 100%; height: 155px;
        max-width: 500px;
    "
    src="https://hatenablog-parts.com/embed?url=https://www.sator-imaging.com/2014/12/blog-post.html">
</iframe>