分かる!リニアワークフローのコンポジット
- 2015/06/13
3DCGやコンポジットの世界にはリニアワークフロー(Linear workflow)という用語があります。リニアワークフローは広義のカラーマネジメント(色管理)のひとつで、色をリニアカラースペース(線形色空間, Linear color space)で扱うという手法です。これにより、フォトリアルな3DCG制作やデジタル合成がやりやすくなると言われます。
現在では多くの3DCGソフト、コンポジットソフトにリニアワークフローの機能が導入されています。しかし、その原理は難解です。今回は初心者向けに、コンポジットにおけるリニアワークフローの基本的な仕組みを分かりやすく紹介できればと思います。
リニアワークフローを理解するには、まず「明るさ」とは何かをはっきりさせた方が良いかもしれません。というのは、リニアワークフローを考えるときには3種類の異なる「明るさ」が存在しているからです。そこで、本文中では3つの言葉を定義して話をしたいと思います。これらは必ずしも特別な専門用語ではありませんが、ここでは特別な意味を持つ言葉にしましょう。
1. Intensity
2. Lightness
3. Value

◆1. Intensity (インテンシティー)
Intensityとは、ここでは現実世界のリニアな光の強度(Linear-light intensity)を意味します。この世界の物理現象としての光の量です。
◆2. Lightness (ライトネス)
Lightnessとは、ここでは人間の知覚(Human perception)の「明るさ」を意味します。この明るさとは、普段は意識することはありませんが、実際には私たちの頭の中にしか存在していない「感覚」です。
◆3. Value (バリュー)
Valueとは、ここでは画像ファイルが持つデータ値(Data value)を指すことにします。つまり、RGB値です。これは実際にはコンピュータの中の「数字」でしかありません。注意が必要なのは、RGB値は絶対的なものではなく、カラースペース(色空間)と呼ばれる色域・ホワイトポイント・ガンマなどを定めた土台の中で色を特定するものだということです(ただし本文ではガンマのみに触れます)。つまり、カラースペースが異なれば、同じ数字が異なる色を意味します。「Value 0.5 の色はどの程度の明るさに見えるか?」といった問いの答えは、カラースペースによって違ってくるのです。
これら3つの「明るさ」の特徴を、もう少し詳しく見ていきましょう!
3つの「明るさ」には、リニア(線形)とノンリニア(非線形)という違いがあります。ここで押さえて欲しいのは以下の3つのポイントです。
1. 現実世界の光、Intensityはリニアである
2. 人間の視覚の明るさ、Lightnessはノンリニアである
3. 一般的な画像のValueはノンリニアで、ディスプレイもノンリニア
これだけ見ると、どうやらリニアなのはIntensityだけのようです。ひとつずつ確認していきましょう。
◆1. 現実世界の光はリニアである
現実世界の光はリニアである、と言われます。現実世界では「1という量の光」に「1という量の光」を重ねると、結果は「2という量の光」になります。とてもシンプルで理解しやすい物理法則です。
◆2. 人間の視覚はノンリニアである
人間の視覚にはガンマがあり、光に対してノンリニアな反応をしています。ちょっと思い出して欲しいことがあります。暗い部屋で電灯を点けると「明るくなった」と感じますが、太陽の下では「明るくなったかよく分らない」と感じたことがあるはずです。増えた光の量は同じでも、感じ方が違います。これは、人間の視覚が光の量をそのまま受け取っているわけではないことを意味しています。視覚は弱い光ほど敏感に反応します。
Lightnesss(知覚の明るさ)は、Intensity(光の量)と比例しません。これはリニアワークフローを理解する上で非常に重要なことです。
たとえば、人間の感じるモニターの白を1.0、黒を0.0とすると、Lightnessは以下のように表わすことができます。

どう感じますか?見ているモニターにもよりますが、数字とグレーの明るさの関係がだいたい一致しているのではないでしょうか?0.5のところに置かれたグレーは、「黒すぎもせず白すぎもしない中間あたりのグレーであろう」と感じられると思います。
一方、今度は現実世界の光の量、Intensity表記でカラーを並べてみましょう。以下のようになります。

こちらはどうでしょう?0.5のところにあるグレーは、中間グレーと呼ぶには少し明るすぎではないでしょうか?そもそも全体的に明るいグレーが多いようです。どこか数字と色の関係がねじ曲がっているような感じがします。しかし、ねじ曲がっているのは人間の方なのです。
人間にとっての中間グレー(Lightness 0.5)とは、およそリニアな光のIntensity 0.18に対応すると言われています。いわゆる「18%グレー」です。ここでは分かりやすさを優先してLightness 0.5 = Intensity 0.2 としましょう。これが視覚のガンマです。グラフではリニア(直線)ではなく、ガンマカーブと呼ばれる曲線が描かれます。

しかし、急にそんなことを言われても理解しにくいものです。そこで「そんな話は信じられない」という人のために、以下の画像を用意しました。もしあなたが今一般的なsRGBのPCモニターで見ているなら、この画像が理解の助けになるかもしれません。

白ピクセルと黒ピクセルを交互に配置したものは、白の半分の光、つまりIntensity 0.5です。しかし、この光は知覚では半分(Lightness 0.5)よりずっと明るく、Lightness 0.7くらいの明るいグレーに感じられます。一方、知覚の中間グレー(Lightness 0.5)というのはもっとずっと暗い光、lintensity 0.2あたりの光なのです。
この人間の視覚のノンリニア反応については、[別記事: ガンマについて]や[別記事: 映画のVFX制作で使用するDPX画像ファイルは何が優れているのか?]にも書きました。良かったら参考にしてください。
◆3. 一般的な画像のValueはノンリニアで、ディスプレイもノンリニア
一般的な画像データにはガンマ補正(Gammma Correction)と呼ばれる処理がされています。ここではsRGBカラースペースの画像について考えたいと思います。sRGB画像の場合、Intensityを約0.45乗したValueで保存しています。
この仕組みにはValue(画像データ値)をLightness(人間の知覚)とほぼ同じバランスに分布して保存する効果があり、データサイズを圧倒的にコンパクトにしています。つまり、sRGBカラースペースは「知覚スペース」ということです。厳密にはsRGBのValue 約0.47がLightness 0.5とされますが、ここでは分かりやすさを優先して Value 0.5 = Lightness 0.5 として話を進めたいと思います。
一方、モニターにはディスプレイガンマ(Display gamma)と呼ばれる効果が存在し、入力されたValueを約2.2乗したIntensityの光を再現します。システム全体としてガンマは相殺され、モニター上にはほぼ「リニアな光」が再現されます。(ガンマ補正やディスプレイガンマについては[別記事: ガンマについて]でより詳しく説明していますので、良かったら参考にしてください。)
画像データに織り込まれているガンマは、データ効率の観点から見れば有意義なものです。しかし、3DCG制作やデジタル合成の世界では、このガンマがしばしば邪魔をしてしまいます。そこでリニアワークフローが必要になるのです。
では、「従来のノンリニアワークフロー」と「リニアワークフロー」の仕組みの違いを見てみましょう。2つのワークフローにおいて、知覚の中間グレー(Lightness 0.5)のValueがどのように合成で扱われるか、追いかけてみましょう。なお、ここで扱う素材は一般的なsRGBカラースペースで保存された画像ファイルと想定します。
◆従来のノンリニアワークフロー
まずは従来のノンリニアワークフローの仕組みを見てみましょう。

sRGB画像ファイルはガンマ補正されたデータです。およそIntensity 0.22の暗い光を、約0.45乗してValue 0.5として保存している状態です。
従来のワークフローでは、このValue 0.5をそのままカラコレや合成に使用します。しかし今はカラコレも合成もせず、そのままにしましょう。
さて、Value 0.5はディスプレイガンマによって2.2乗され、モニター上にはIntensity 0.22のリニアな光を再現します。この光は人間にとって中間グレー(Lightness 0.5)に見えます。
以上です。仕組みを聞くと難解かもしれませんが、このワークフローではユーザーは直感的に作業できます。というのは、結局のところsRGB画像データのValue 0.5は人間にとってもLightness 0.5と感じるので、感覚とほぼ一致しているのです。
◆リニアワークフロー
ではリニアワークフローの場合を説明します。同じsRGB画像ファイルをリニアワークフローで扱うと、どうなるでしょうか?さらに難解です。

リニアワークフローの場合、sRGB画像ファイルを読み込むと直ちにリニアライズ(Linearizaion, 線形化)と呼ばれる処理を行います。これは画像にエンコードされているガンマの逆数のガンマを適用し、ガンマ1.0のリニアな状態にすることです。つまり、Value 0.5はソフトウェア内部で2.2乗され、Value 0.22に変換されます。
リニアワークフローでは、このValue 0.22をカラコレや合成に使用します。これが「リニアカラースぺースで作業する」ということです。しかし今はカラコレも合成もせず、そのままにしましょう。
リニアワークフローの場合、このValue 0.22はソフトウェアがモニターに出力する直前に、ViewLUT(ビューラット)と呼ばれるデータ変換表を通過します。完全なリニアワークフローのシステムの場合、LUTはユーザーには分からないところで働いているかもしれません。LUTの働きはソフトやワークフローによってやや異なる部分ですが、ここではシンプルなガンマ補正を行うものとして説明します。つまり、Value 0.22はLUTによって約0.45乗されたValue 0.5に変換されます。
ここから先は従来と同じです。Value 0.5はディスプレイガンマによって2.2乗され、モニター上にはIntensity 0.22のリニアな光を再現します。人間には中間グレー(Lightness 0.5)に見えます。
さて、2つのワークフローを説明しました。何が違うのでしょうか?実はこれだけでは何も違いません。どちらもsRGB画像のValue 0.5からスタートし、最終的に人間は「中間グレー」を感じました。
この2つのワークフローの「違い」が現れるのは、カラコレや合成を行なったときです。
リニアワークフローでは、いったい何が変わるのでしょうか?ある意味では、すべてが変わります。ここでは変化の分かりやすい3つのポイントを紹介したいと思います。
1.「加算」が変わる
リニアワークフローでは加算(足し算)が変わります。RGBは加法混色のため、値を足すと光が重なったような効果を得ることができます。しかし2つのワークフローでは結果が異なります。

従来のワークフローでは、加算が「白飛び」しやすいことで有名です。これを好む人もいますが、「繊細な調整が難しい」と言って嫌う人も少なくありません。いずれにせよ、従来の加算は物理的には正しくありません。ここでは、2つの知覚の中間グレー(Lightness 0.5)を加算でブレンドした場合を比較してみたいと思います。
従来のワークフローでは、2つの(知覚の)中間グレーを加算すると白になります。内部データを見ると、Value 0.5 + 0.5 = 1という計算が行われています。感覚的には正しいようで、物理的には間違いです。モニター上の光では、Intensity 0.22 + 0.22 = 1 という有り得ない現象が起きてしまっているからです。

一方、リニアワークフローではどうでしょうか。リニアカラースペースでは同じ中間グレーをValue 0.22で表していました。内部では Value 0.22 + 0.22 = 0.44 という計算が行われます。モニターにはIntensity 0.44 の光が再現され、これは人間の知覚では Ligtness 0.7 くらいの「やや明るいグレー」に見えます。これは物理的に正しい加算です。

リニアワークフローでは、レンズフレアやグローのような「光モノ」の合成がよりリアルにしやすいというメリットがあります。他にもメリットがあります。3DCGのコンポジットでは「リフレクション素材」のようなレンダーパス(Render pass, AOVとも)を組み合わせる場合があります。しかし従来のワークフローでは加算が正しく働かないために、適切な合成結果を得ることができないという問題がありました。リニアワークフローによるコンポジットでは、正しい結果を得ることができます。
2.合成が変わる
リニアワークフローでは加算だけでなく、そもそも通常の合成が変わります。通常の合成とは、専門的には"Over"と呼ばれるアルファチャンネル(不透明度)を使った画像合成です。単純に2つの画像をオーバーラップさせると、リニアワークフローの方が明るい結果になります。

従来のワークフローでは、黒(0.0)の背景レイヤーに対して白(1.0)の前景レイヤーを50%の不透明度で合成すると Value 0.5 という計算結果になります。ディスプレイガンマの働きで2.2乗され、モニター上のIntensity 0.22のリニアの光になり、人間は中間グレー(Lightness 0.5)に感じます。

リニアワークフローでも計算結果は同じValue 0.5 という結果になります。しかし、こちらはLUTとディスプレイガンマを通過して、モニター上のIntensity 0.5 のリニアの光になります。この光を見た人間は、やや明るいグレー(Lightness 0.7)を知覚します。

リニアワークフローのValue 0.5は知覚と一致しません。これは、カラコレも変わることを意味します。もし「知覚の中間グレー」を得たい場合、Value 0.2前後を狙う必要があります。
3.ブラーが変わる
リニアワークフローではブラーも変わります。見てきたように、白ピクセルと黒ピクセルを混ぜ合わせたときのグレーが変わるのですから、同じ理屈でブラーも異なる結果になります。ここでは普通のJPEG画像ファイルをぼかしてみることにします。リニアワークフローでは、より明るい結果を得ることができます。

従来のブラーでは、白と黒がブラーによって混ざり合うと、知覚の中間グレーになります。しかしこれは物理的には正しくない光の現象です。カメラのレンズによるブラーや、肉眼で視界がぼやけたときに見える景色は、ぼやけたからといって急激に暗くなることはありません。つまりリニアカラースペースで行うブラーの方がよりリアルに見えます。

同様にモーションブラーも違ってきます。リニアワークフローでは、よりリアルな結果を得ることができます。

リニアワークフローで変わる部分を3つのポイントで見てきました。しかし、これらを見るだけで、他にもさまざまな変化が出てくることが予想できると思います。例えば、エッジ部分のアンチエイリアスの計算もリニアワークフローでは変わります。画像を拡大、縮小したときのピクセル補間も変わってきます。グローやフレアといった効果や、グラデーション表現も変わります。つまり、リニアワークフローではすべての計算が変わるということです。
特筆すべきは、素材が「ただのJPEG画像」だったとしても、リニアカラースペースで処理すればより良い結果を得られる点です。しかしさらに優れた結果を望むこともできます。
リニアワークフローとよく一緒に出てくる言葉に、浮動小数点数(Floating point)という用語があります。普通は単にfloat(フロート)と呼ばれます。混同されがちですが、「リニア」と「float」は別の問題です。ここではfloatについて説明しておきたいと思います。
◆浮動小数点数(Floating point)とは?
floatの前に、まずは整数のデータについておさらいしましょう。多くの人が慣れ親しんでいる色深度 8bitカラーは、2の8乗=256階調を扱います。黒を0、白を255とし、0~255の範囲で色を表します。これは整数(Integer, インテジャー)のデータです。

これに対し色深度 32bitは黒を0.0、白を1.0とし、0.0~1.0の範囲で色を表します。これが浮動小数点数(Floating point)です。floatの特徴は、0.0に満たないマイナス値や、1.0を超える数値を無限に扱えることです。

0未満はマイナス値であり、黒より暗い色(スーパーブラック)を表します。1を超える値は白より明るい色(スーパーホワイト、オーバーブライト)を表します。これらの色はもちろんモニター上には表示できませんが、データ値として存在します。このメリットは、クリッピング(Clipping)を避けることができる点です。
従来の整数で計算するデジタル合成では「白」という限界点があります。合成やカラコレを行った際にRGB値が255に到達すると、それ以上の数値を表すことができないので、そこで止められてしまいます。この効果をクリップ(Clip)とかクランプ(Clamp)と呼んでいます。

整数で計算する合成では、「白飛び」した色は元に戻りません。この問題は多くのアーティストを悩ませてきました。しかし、floatで計算する合成では、一度白飛びした色も暗くしたときにディティールが復活します。1.0を超える値を扱えるからです。

必ずしもリニアワークフローがfloat計算とは限りませんが、多くはfloatで計算されます。これにより現実世界の光の現象を再現しやすく、リアルな画づくりに向いているとされます。
◆OpenEXR画像ファイル形式
前述したfloatのような広い幅の光を保持する画像を、一般的にハイダイナミックレンジ(HDR)の画像と言います。リニアワークフローで、かつfloat計算のシステムで合成する場合、素材もHDRの画像であることが理想的です。よく使われるのはOpenEXRという画像ファイル形式です。
OpenEXRは米国のインダストリアル・ライト&マジック社が開発したHDR画像ファイル形式で、現在世界中のVFXプロダクションで使用されている代表的なフォーマットの1つです。OpenEXRでは16bit floating-point / 32bit floating-point / 32bit integerという形式から選ぶことができます。最もよく使用されるのは"half-float"とか"half"と呼ばれる16bit floating-pointで、従来のfloatの画像ファイルと比較すると劇的にデータサイズを小さくして保存できます。
JPEG画像などが通常sRGBカラースペースで保存するのに対して、OpenEXRなどのHDR画像では基本的にリニアカラースペースで保存します。そのためこのようなリニア画像をコンポジットソフトに読み込んで使用する場合、「リニアライズ」という処理は必要ありません。むしろリニアライズを実行すると、暗くするカラコレを行うことになってしまいます。

読み込んでいる画像がsRGBカラースペースか、リニアカラースペースか、あるいはまた別のカラースペースなのか、よく注意する必要があります。合成ソフトによってやり方に違いがあるかもしれませんが、多くは「どのようなカラースペースの画像を読み込んでいるか」をソフトウェア側に知らせるためのドロップダウンメニューなどが用意されていると思います。
OpenEXRを使用すると、3DCGソフトとコンポジットソフトの間で理想的なデータのやり取りができるというメリットがあります。3DCGソフトの内部では通常リニアな計算が行われますが、画像を保存する際にTga, Png, Tiff(int)といった画像ファイル形式を選択すると、ガンマ補正がされる上、クリッピングが発生するという問題があります。OpenEXRであれば、CG画像データを損失せずにコンポジットソフトに持ち込むことが可能になります。
最後までお読みいただき、ありがとうございます。説明不足の点もあるかと思いますが、リニアワークフローの基本的な仕組みを紹介できたのではないかと思います。見てきたように、リニアワークフローは従来の「知覚ベース」の作業から、「物理ベース」への大転換です。これは画期的であると同時に、今までのやり方に慣れたアーティストを混乱させるものでもあります。このページが初心者の理解に役立てば幸いです。
現在では多くの3DCGソフト、コンポジットソフトにリニアワークフローの機能が導入されています。しかし、その原理は難解です。今回は初心者向けに、コンポジットにおけるリニアワークフローの基本的な仕組みを分かりやすく紹介できればと思います。
3種類の「明るさ」
リニアワークフローを理解するには、まず「明るさ」とは何かをはっきりさせた方が良いかもしれません。というのは、リニアワークフローを考えるときには3種類の異なる「明るさ」が存在しているからです。そこで、本文中では3つの言葉を定義して話をしたいと思います。これらは必ずしも特別な専門用語ではありませんが、ここでは特別な意味を持つ言葉にしましょう。
1. Intensity
2. Lightness
3. Value

◆1. Intensity (インテンシティー)
Intensityとは、ここでは現実世界のリニアな光の強度(Linear-light intensity)を意味します。この世界の物理現象としての光の量です。
◆2. Lightness (ライトネス)
Lightnessとは、ここでは人間の知覚(Human perception)の「明るさ」を意味します。この明るさとは、普段は意識することはありませんが、実際には私たちの頭の中にしか存在していない「感覚」です。
◆3. Value (バリュー)
Valueとは、ここでは画像ファイルが持つデータ値(Data value)を指すことにします。つまり、RGB値です。これは実際にはコンピュータの中の「数字」でしかありません。注意が必要なのは、RGB値は絶対的なものではなく、カラースペース(色空間)と呼ばれる色域・ホワイトポイント・ガンマなどを定めた土台の中で色を特定するものだということです(ただし本文ではガンマのみに触れます)。つまり、カラースペースが異なれば、同じ数字が異なる色を意味します。「Value 0.5 の色はどの程度の明るさに見えるか?」といった問いの答えは、カラースペースによって違ってくるのです。
これら3つの「明るさ」の特徴を、もう少し詳しく見ていきましょう!
「リニア」と「ノンリニア」
3つの「明るさ」には、リニア(線形)とノンリニア(非線形)という違いがあります。ここで押さえて欲しいのは以下の3つのポイントです。
1. 現実世界の光、Intensityはリニアである
2. 人間の視覚の明るさ、Lightnessはノンリニアである
3. 一般的な画像のValueはノンリニアで、ディスプレイもノンリニア
これだけ見ると、どうやらリニアなのはIntensityだけのようです。ひとつずつ確認していきましょう。
◆1. 現実世界の光はリニアである
現実世界の光はリニアである、と言われます。現実世界では「1という量の光」に「1という量の光」を重ねると、結果は「2という量の光」になります。とてもシンプルで理解しやすい物理法則です。
◆2. 人間の視覚はノンリニアである
人間の視覚にはガンマがあり、光に対してノンリニアな反応をしています。ちょっと思い出して欲しいことがあります。暗い部屋で電灯を点けると「明るくなった」と感じますが、太陽の下では「明るくなったかよく分らない」と感じたことがあるはずです。増えた光の量は同じでも、感じ方が違います。これは、人間の視覚が光の量をそのまま受け取っているわけではないことを意味しています。視覚は弱い光ほど敏感に反応します。
Lightnesss(知覚の明るさ)は、Intensity(光の量)と比例しません。これはリニアワークフローを理解する上で非常に重要なことです。
たとえば、人間の感じるモニターの白を1.0、黒を0.0とすると、Lightnessは以下のように表わすことができます。

どう感じますか?見ているモニターにもよりますが、数字とグレーの明るさの関係がだいたい一致しているのではないでしょうか?0.5のところに置かれたグレーは、「黒すぎもせず白すぎもしない中間あたりのグレーであろう」と感じられると思います。
一方、今度は現実世界の光の量、Intensity表記でカラーを並べてみましょう。以下のようになります。

こちらはどうでしょう?0.5のところにあるグレーは、中間グレーと呼ぶには少し明るすぎではないでしょうか?そもそも全体的に明るいグレーが多いようです。どこか数字と色の関係がねじ曲がっているような感じがします。しかし、ねじ曲がっているのは人間の方なのです。
人間にとっての中間グレー(Lightness 0.5)とは、およそリニアな光のIntensity 0.18に対応すると言われています。いわゆる「18%グレー」です。ここでは分かりやすさを優先してLightness 0.5 = Intensity 0.2 としましょう。これが視覚のガンマです。グラフではリニア(直線)ではなく、ガンマカーブと呼ばれる曲線が描かれます。

しかし、急にそんなことを言われても理解しにくいものです。そこで「そんな話は信じられない」という人のために、以下の画像を用意しました。もしあなたが今一般的なsRGBのPCモニターで見ているなら、この画像が理解の助けになるかもしれません。

白ピクセルと黒ピクセルを交互に配置したものは、白の半分の光、つまりIntensity 0.5です。しかし、この光は知覚では半分(Lightness 0.5)よりずっと明るく、Lightness 0.7くらいの明るいグレーに感じられます。一方、知覚の中間グレー(Lightness 0.5)というのはもっとずっと暗い光、lintensity 0.2あたりの光なのです。
この人間の視覚のノンリニア反応については、[別記事: ガンマについて]や[別記事: 映画のVFX制作で使用するDPX画像ファイルは何が優れているのか?]にも書きました。良かったら参考にしてください。
◆3. 一般的な画像のValueはノンリニアで、ディスプレイもノンリニア
一般的な画像データにはガンマ補正(Gammma Correction)と呼ばれる処理がされています。ここではsRGBカラースペースの画像について考えたいと思います。sRGB画像の場合、Intensityを約0.45乗したValueで保存しています。
この仕組みにはValue(画像データ値)をLightness(人間の知覚)とほぼ同じバランスに分布して保存する効果があり、データサイズを圧倒的にコンパクトにしています。つまり、sRGBカラースペースは「知覚スペース」ということです。厳密にはsRGBのValue 約0.47がLightness 0.5とされますが、ここでは分かりやすさを優先して Value 0.5 = Lightness 0.5 として話を進めたいと思います。
一方、モニターにはディスプレイガンマ(Display gamma)と呼ばれる効果が存在し、入力されたValueを約2.2乗したIntensityの光を再現します。システム全体としてガンマは相殺され、モニター上にはほぼ「リニアな光」が再現されます。(ガンマ補正やディスプレイガンマについては[別記事: ガンマについて]でより詳しく説明していますので、良かったら参考にしてください。)
画像データに織り込まれているガンマは、データ効率の観点から見れば有意義なものです。しかし、3DCG制作やデジタル合成の世界では、このガンマがしばしば邪魔をしてしまいます。そこでリニアワークフローが必要になるのです。
従来のノンリニアワークフローとリニアワークフロー
では、「従来のノンリニアワークフロー」と「リニアワークフロー」の仕組みの違いを見てみましょう。2つのワークフローにおいて、知覚の中間グレー(Lightness 0.5)のValueがどのように合成で扱われるか、追いかけてみましょう。なお、ここで扱う素材は一般的なsRGBカラースペースで保存された画像ファイルと想定します。
◆従来のノンリニアワークフロー
まずは従来のノンリニアワークフローの仕組みを見てみましょう。

sRGB画像ファイルはガンマ補正されたデータです。およそIntensity 0.22の暗い光を、約0.45乗してValue 0.5として保存している状態です。
従来のワークフローでは、このValue 0.5をそのままカラコレや合成に使用します。しかし今はカラコレも合成もせず、そのままにしましょう。
さて、Value 0.5はディスプレイガンマによって2.2乗され、モニター上にはIntensity 0.22のリニアな光を再現します。この光は人間にとって中間グレー(Lightness 0.5)に見えます。
以上です。仕組みを聞くと難解かもしれませんが、このワークフローではユーザーは直感的に作業できます。というのは、結局のところsRGB画像データのValue 0.5は人間にとってもLightness 0.5と感じるので、感覚とほぼ一致しているのです。
◆リニアワークフロー
ではリニアワークフローの場合を説明します。同じsRGB画像ファイルをリニアワークフローで扱うと、どうなるでしょうか?さらに難解です。

リニアワークフローの場合、sRGB画像ファイルを読み込むと直ちにリニアライズ(Linearizaion, 線形化)と呼ばれる処理を行います。これは画像にエンコードされているガンマの逆数のガンマを適用し、ガンマ1.0のリニアな状態にすることです。つまり、Value 0.5はソフトウェア内部で2.2乗され、Value 0.22に変換されます。
リニアワークフローでは、このValue 0.22をカラコレや合成に使用します。これが「リニアカラースぺースで作業する」ということです。しかし今はカラコレも合成もせず、そのままにしましょう。
リニアワークフローの場合、このValue 0.22はソフトウェアがモニターに出力する直前に、ViewLUT(ビューラット)と呼ばれるデータ変換表を通過します。完全なリニアワークフローのシステムの場合、LUTはユーザーには分からないところで働いているかもしれません。LUTの働きはソフトやワークフローによってやや異なる部分ですが、ここではシンプルなガンマ補正を行うものとして説明します。つまり、Value 0.22はLUTによって約0.45乗されたValue 0.5に変換されます。
ここから先は従来と同じです。Value 0.5はディスプレイガンマによって2.2乗され、モニター上にはIntensity 0.22のリニアな光を再現します。人間には中間グレー(Lightness 0.5)に見えます。
さて、2つのワークフローを説明しました。何が違うのでしょうか?実はこれだけでは何も違いません。どちらもsRGB画像のValue 0.5からスタートし、最終的に人間は「中間グレー」を感じました。
この2つのワークフローの「違い」が現れるのは、カラコレや合成を行なったときです。
リニアワークフローで何が変わるか?
リニアワークフローでは、いったい何が変わるのでしょうか?ある意味では、すべてが変わります。ここでは変化の分かりやすい3つのポイントを紹介したいと思います。
1.「加算」が変わる
リニアワークフローでは加算(足し算)が変わります。RGBは加法混色のため、値を足すと光が重なったような効果を得ることができます。しかし2つのワークフローでは結果が異なります。

従来のワークフローでは、加算が「白飛び」しやすいことで有名です。これを好む人もいますが、「繊細な調整が難しい」と言って嫌う人も少なくありません。いずれにせよ、従来の加算は物理的には正しくありません。ここでは、2つの知覚の中間グレー(Lightness 0.5)を加算でブレンドした場合を比較してみたいと思います。
従来のワークフローでは、2つの(知覚の)中間グレーを加算すると白になります。内部データを見ると、Value 0.5 + 0.5 = 1という計算が行われています。感覚的には正しいようで、物理的には間違いです。モニター上の光では、Intensity 0.22 + 0.22 = 1 という有り得ない現象が起きてしまっているからです。

一方、リニアワークフローではどうでしょうか。リニアカラースペースでは同じ中間グレーをValue 0.22で表していました。内部では Value 0.22 + 0.22 = 0.44 という計算が行われます。モニターにはIntensity 0.44 の光が再現され、これは人間の知覚では Ligtness 0.7 くらいの「やや明るいグレー」に見えます。これは物理的に正しい加算です。

リニアワークフローでは、レンズフレアやグローのような「光モノ」の合成がよりリアルにしやすいというメリットがあります。他にもメリットがあります。3DCGのコンポジットでは「リフレクション素材」のようなレンダーパス(Render pass, AOVとも)を組み合わせる場合があります。しかし従来のワークフローでは加算が正しく働かないために、適切な合成結果を得ることができないという問題がありました。リニアワークフローによるコンポジットでは、正しい結果を得ることができます。
2.合成が変わる
リニアワークフローでは加算だけでなく、そもそも通常の合成が変わります。通常の合成とは、専門的には"Over"と呼ばれるアルファチャンネル(不透明度)を使った画像合成です。単純に2つの画像をオーバーラップさせると、リニアワークフローの方が明るい結果になります。

従来のワークフローでは、黒(0.0)の背景レイヤーに対して白(1.0)の前景レイヤーを50%の不透明度で合成すると Value 0.5 という計算結果になります。ディスプレイガンマの働きで2.2乗され、モニター上のIntensity 0.22のリニアの光になり、人間は中間グレー(Lightness 0.5)に感じます。

リニアワークフローでも計算結果は同じValue 0.5 という結果になります。しかし、こちらはLUTとディスプレイガンマを通過して、モニター上のIntensity 0.5 のリニアの光になります。この光を見た人間は、やや明るいグレー(Lightness 0.7)を知覚します。

リニアワークフローのValue 0.5は知覚と一致しません。これは、カラコレも変わることを意味します。もし「知覚の中間グレー」を得たい場合、Value 0.2前後を狙う必要があります。
3.ブラーが変わる
リニアワークフローではブラーも変わります。見てきたように、白ピクセルと黒ピクセルを混ぜ合わせたときのグレーが変わるのですから、同じ理屈でブラーも異なる結果になります。ここでは普通のJPEG画像ファイルをぼかしてみることにします。リニアワークフローでは、より明るい結果を得ることができます。

従来のブラーでは、白と黒がブラーによって混ざり合うと、知覚の中間グレーになります。しかしこれは物理的には正しくない光の現象です。カメラのレンズによるブラーや、肉眼で視界がぼやけたときに見える景色は、ぼやけたからといって急激に暗くなることはありません。つまりリニアカラースペースで行うブラーの方がよりリアルに見えます。

同様にモーションブラーも違ってきます。リニアワークフローでは、よりリアルな結果を得ることができます。

リニアワークフローで変わる部分を3つのポイントで見てきました。しかし、これらを見るだけで、他にもさまざまな変化が出てくることが予想できると思います。例えば、エッジ部分のアンチエイリアスの計算もリニアワークフローでは変わります。画像を拡大、縮小したときのピクセル補間も変わってきます。グローやフレアといった効果や、グラデーション表現も変わります。つまり、リニアワークフローではすべての計算が変わるということです。
特筆すべきは、素材が「ただのJPEG画像」だったとしても、リニアカラースペースで処理すればより良い結果を得られる点です。しかしさらに優れた結果を望むこともできます。
浮動小数点数(Floating point)とOpenEXR
リニアワークフローとよく一緒に出てくる言葉に、浮動小数点数(Floating point)という用語があります。普通は単にfloat(フロート)と呼ばれます。混同されがちですが、「リニア」と「float」は別の問題です。ここではfloatについて説明しておきたいと思います。
◆浮動小数点数(Floating point)とは?
floatの前に、まずは整数のデータについておさらいしましょう。多くの人が慣れ親しんでいる色深度 8bitカラーは、2の8乗=256階調を扱います。黒を0、白を255とし、0~255の範囲で色を表します。これは整数(Integer, インテジャー)のデータです。

これに対し色深度 32bitは黒を0.0、白を1.0とし、0.0~1.0の範囲で色を表します。これが浮動小数点数(Floating point)です。floatの特徴は、0.0に満たないマイナス値や、1.0を超える数値を無限に扱えることです。

0未満はマイナス値であり、黒より暗い色(スーパーブラック)を表します。1を超える値は白より明るい色(スーパーホワイト、オーバーブライト)を表します。これらの色はもちろんモニター上には表示できませんが、データ値として存在します。このメリットは、クリッピング(Clipping)を避けることができる点です。
従来の整数で計算するデジタル合成では「白」という限界点があります。合成やカラコレを行った際にRGB値が255に到達すると、それ以上の数値を表すことができないので、そこで止められてしまいます。この効果をクリップ(Clip)とかクランプ(Clamp)と呼んでいます。

整数で計算する合成では、「白飛び」した色は元に戻りません。この問題は多くのアーティストを悩ませてきました。しかし、floatで計算する合成では、一度白飛びした色も暗くしたときにディティールが復活します。1.0を超える値を扱えるからです。

必ずしもリニアワークフローがfloat計算とは限りませんが、多くはfloatで計算されます。これにより現実世界の光の現象を再現しやすく、リアルな画づくりに向いているとされます。
◆OpenEXR画像ファイル形式
前述したfloatのような広い幅の光を保持する画像を、一般的にハイダイナミックレンジ(HDR)の画像と言います。リニアワークフローで、かつfloat計算のシステムで合成する場合、素材もHDRの画像であることが理想的です。よく使われるのはOpenEXRという画像ファイル形式です。
OpenEXRは米国のインダストリアル・ライト&マジック社が開発したHDR画像ファイル形式で、現在世界中のVFXプロダクションで使用されている代表的なフォーマットの1つです。OpenEXRでは16bit floating-point / 32bit floating-point / 32bit integerという形式から選ぶことができます。最もよく使用されるのは"half-float"とか"half"と呼ばれる16bit floating-pointで、従来のfloatの画像ファイルと比較すると劇的にデータサイズを小さくして保存できます。
JPEG画像などが通常sRGBカラースペースで保存するのに対して、OpenEXRなどのHDR画像では基本的にリニアカラースペースで保存します。そのためこのようなリニア画像をコンポジットソフトに読み込んで使用する場合、「リニアライズ」という処理は必要ありません。むしろリニアライズを実行すると、暗くするカラコレを行うことになってしまいます。

読み込んでいる画像がsRGBカラースペースか、リニアカラースペースか、あるいはまた別のカラースペースなのか、よく注意する必要があります。合成ソフトによってやり方に違いがあるかもしれませんが、多くは「どのようなカラースペースの画像を読み込んでいるか」をソフトウェア側に知らせるためのドロップダウンメニューなどが用意されていると思います。
OpenEXRを使用すると、3DCGソフトとコンポジットソフトの間で理想的なデータのやり取りができるというメリットがあります。3DCGソフトの内部では通常リニアな計算が行われますが、画像を保存する際にTga, Png, Tiff(int)といった画像ファイル形式を選択すると、ガンマ補正がされる上、クリッピングが発生するという問題があります。OpenEXRであれば、CG画像データを損失せずにコンポジットソフトに持ち込むことが可能になります。
おわりに
最後までお読みいただき、ありがとうございます。説明不足の点もあるかと思いますが、リニアワークフローの基本的な仕組みを紹介できたのではないかと思います。見てきたように、リニアワークフローは従来の「知覚ベース」の作業から、「物理ベース」への大転換です。これは画期的であると同時に、今までのやり方に慣れたアーティストを混乱させるものでもあります。このページが初心者の理解に役立てば幸いです。
参考文献
1. fxguide. "The Art of Digital Color". http://www.fxguide.com/featured/the-art-of-digital-color/ (参照 2015-06-13).
2. Tuts+ Motion Graphics. " Linear Workflow For The AE User". https://www.youtube.com/watch?v=jCVIqG-D2Vk (参照 2015-06-13).
3. CGWORLD.jp. " Nuke プラクティカル・ガイド:Vol.6:主要 3DCG ソフトウェアとの連帯・前編(3ds Max & Maya)". http://cgworld.jp/regular/nuke006-2.html (参照 2015-06-13).
4. brave rabbit. "linearWorkflow_eng.pdf" http://www.braverabbit.de/pdf/linearWorkflow_eng.pdf (参照 2015-06-13).
5. RenderMan. "Grand Tour Part 7: Compositing" http://renderman.pixar.com/view/TGT_Compositing (参照 2015-06-13).
6. Johan B. aka Seazo. "Understanding Linear Workflow and Gamma" http://www.seazo.no/linear-workflow (参照 2015-06-13).
1. fxguide. "The Art of Digital Color". http://www.fxguide.com/featured/the-art-of-digital-color/ (参照 2015-06-13).
2. Tuts+ Motion Graphics. " Linear Workflow For The AE User". https://www.youtube.com/watch?v=jCVIqG-D2Vk (参照 2015-06-13).
3. CGWORLD.jp. " Nuke プラクティカル・ガイド:Vol.6:主要 3DCG ソフトウェアとの連帯・前編(3ds Max & Maya)". http://cgworld.jp/regular/nuke006-2.html (参照 2015-06-13).
4. brave rabbit. "linearWorkflow_eng.pdf" http://www.braverabbit.de/pdf/linearWorkflow_eng.pdf (参照 2015-06-13).
5. RenderMan. "Grand Tour Part 7: Compositing" http://renderman.pixar.com/view/TGT_Compositing (参照 2015-06-13).
6. Johan B. aka Seazo. "Understanding Linear Workflow and Gamma" http://www.seazo.no/linear-workflow (参照 2015-06-13).
- 関連記事
-
- 実写合成のチェックリスト (2018/03/06)
- 合成のなじみを良くする「エッジブレンディング」のテクニック (2017/04/11)
- グローは最後に合成すべし (2016/08/20)
- VFX制作のコンポジット作業で注意すべき10項目 (2016/07/01)
- 影を合成するテクニック (2015/12/13)
- 画面の見映えを良くする配色のテクニック (2015/08/22)
- グロー表現のクオリティーを高める3つのポイント (2015/07/25)
- 分かる!リニアワークフローのコンポジット (2015/06/13)
- リアルな実写合成(VFX)にはノイズ除去が重要 (2015/05/15)
- デジタルで画づくりするテクニックまとめ! (2015/04/29)
- ガンマについて (2015/03/13)
- 映画のVFX制作で使用するDPX画像ファイルは何が優れているのか? (2015/02/11)
- 画のクオリティーをアップする煙合成のコツ (2014/12/16)
- なぜ映画の背景はボケているのか?被写界深度についての考察 (2014/11/10)
- 画像を美しく加工するために押さえておきたいピクセルの知識 (2014/08/06)