2012年5月21日月曜日

リニアワークフロー AEでCGのシェーダー等の再構築の検証

リニアワークフローを導入する際、各ソフトの設定をどうするか?実は結構、難しい事だったりします。サイトなどで紹介されている方法を安易に導入してしまうと色んな問題が発生してしまいます。

リニアワークフローで重要になってくるのは光のデータ(画像) が、どこでガンマがかかり、どのように処理(合成)がされたのかです。これには、アルファチャンネルも含みます。コンポジットソフトでシェーダーを再構築する際などに、この辺りが理解出来ていないと色んな問題が発生します。と言う事で3dsMAXとAEで検証してみました。いや、そもそもカラーマネジメントはリニア関係なく重要ですね・・・。

コンポジットソフトをAEにしたのは、Nukeは基本的にリニアでコンポジットされる設計になっているので・・・。後、僕はテクニカルな事にかなり疎いので、間違っている所があるかもしれません。ご了承下さい。確かな事を書ければいいのですが・・・。


検証1】画像にはガンマをかけず、viewLutで画像を確認する方法

CGの各素材をガンマをかけずにexrで保存して、AEでリニア(32bit float)でコンプした場合。リニアワークフローとしては一番シンプルで分かりやすい方法。と言うか、本当の意味でのリニアワークフロー。CGのレンダラーが計算した光をそのままコンポジットソフトに渡す事が出来る。また、合成する際も基本的には同じ計算結果になるので、お互いのソフトのコミュニケーションが取りやすくなる。CG内で加算を使った。コンポジットでも同じように加算した。全く同じ結果になる。

MAXの設定はこんな感じ。
ガンマ2.2のViewLutでレンダリングを確認。保存時はガンマ1.0で保存


出力した素材のモニターに表示されている状態
beauty
Fogなし
Fogあり(αチャンネルあり)

AEでの設定

このように設定しておくと、exrやHDR以外のsRGBのフォーマットの画像を読み込む際にリニアに変換して読み込んでくれます。(エフェクトは対応しているものに限る)

ちなみにAEのviewLutに該当する所は多分ここ


「fogなし」と「fog」を「通常」で合成します。
コンポジット結果
問題なくBeautyと同じ状態になります。合成も32bit Floatで行なわれるので精度も非常に高く、よく分からない場合はお勧めの方法。ただし、重い(らしい)

何が起きたのか、計算式で。

まず、CGの世界です。CGのレンダリングは特別な場合を除き、基本的にはリニア(32bit float)で計算されます。そして、MaxのFogはおそらく以下の計算式で合成されている思われます。(検証はしてみたものの、プログラムの中身を見たわけではないので・・・)


O:レンダリング画像(Beauty) A:Fog   B:背景   a:Aのα

O = A + (B *(1-a))


そして、AEの通常の計算式はおそらく以下のものです。(ちょっと調べたのですが、明確に書いてある所がなかったので・・・)

O = (A*a) + (B*(1-a))

(A*a)の部分以外は、CGのFogの重ね方と同じになります。今回の霧のような合成では問題にならない所です。結果、同じ答え=同じ画像になるようです。加算(足し算) だと分かりやすいですかね。

MAX
O = A + B
AE
O = A + B

viewLutを当ててモニターで確認する行為は、画像を確認したい部分にガンマ2.2の補正をかけて、その領域だけモニタのガンマ1.0にします。

まず、Oにガンマ2.2用の補正をかけます。画像は明るくなります。

 pow ( O , 0.4545)

これをモニター(ガンマ2.2)で確認。画像は暗くなり元のデータの状態(リニア)で観る事が出来ます。

pow ( O , 2.2)

ややこしいですね・・・。ガンマ1.0のモニターがあればとてもシンプルなのですが。この辺りはテラオカさんのブログで詳しく説明してあります。
http://tiraoka.blogspot.jp/2011/10/blog-post.html
Autodeskとかも
http://area.autodesk.jp/column/tutorial/designviz_essence/1_about_linearworkflow_1/

MAX内でガンマ計算するときの書式は
pow 0.5 2.2
みたいな感じで。
ぽぅ~

【B】両ソフト、デフォルトのままで作業した場合(従来のワークフロー)

まず、MAXですが何も考えずレンダリングしてTIF(8bit)で保存しました。

出力した素材のモニターに表示されている状態
Beauty

Fogなし

Fog

 AEもデフォルトの設定のまま通常で合成
コンポジット結果
ちゃんと、Beautyになりましたね・・・。

まず、MAX側ですがリニアで計算された光のデータ(32bit Float)が整数になります。この際、1より強い光があった場合はクランプされてしまいます。後は、光の階調が256段階になります。そして、保存する際にはガンマ補正がかからないので、保存される画像のガンマは一応リニアと言ってよい状態になります。

<MAXで起きた事>
O:レンダリング画像(Beauty) A:Fog   B:背景   a:Aのα

O = A + (B *(1-a))

ここまでは 、32bit floatで計算。そして、TIFに保存する際に8bitの整数にして保存。

<AE側>
 描画モードは

O = (A*a) + (B*(1-a))

で変わらずと言う事でしょうか? でないと、Beautyにならないはずですもんね・・・。
(加算などで試して見ましたが他のモードも変わらないようです。8bit intであろうと32bit floatであろうと加算は加算)

でも、整数で計算されるので、合成の精度は少し低くなるのではないでしょうか?
例えば乗算ですが、floatの場合はただの掛け算ですむのですが

O = A * B

これが8bitの整数だと・・・

O = (A * B) / 255

みたいな感じになる気がします。そうだった場合、割り切れなかった小数点以下は切り捨てられてしまうような?「通常」で重ねただけでも同じようなことが起きている気がなんとなくします・・・。気にするほどではないと思いますが・・・。

という事で、この方法での問題点はリニアの状態で画像を見れていないことくらいですか?実はLWFを意識する以前のコンポジット、そこまで間違ってはいなかったのですね・・・。リニアで作業していたけどviewLUTを適用して見ていなかっただけという事になります。CG素材をコンポジットする際に特に問題がなかったのはこのせいですね。

後、細かい所では、整数で計算が行なわれるので、強い光はクランプされてしまう事と。コンポジットの精度がちょっと落ちる(要検証)ですかね?(画像のカラースペースを例えば「sRGB→リニア→sRGB」と変換した際、元の数値と違ってくるケースもあると思います。)

という事で、ViewLut当てて見れれば割といける気がします。MAXは【検証1】と同じ方法で問題ないですね。(【検証1】でも、floatのデータにこだわらないのであれば、別にexrでもなくてもよいという事になります。)テクスチャーにsRGBの素材を読み込んでいるときは、カラースペースをリニアに変換する必要はあります。
そして、AEですが・・・設定がよく分からないので調整レイヤーを一番上にのせて「レベル補正」 でガンマ2.2としておきました・・・。

一応見た目は正しいと言える結果に
ただし、注意しないといけないのは、CG以外の素材でJPGなどsRGB用のフォーマットは、どこかでカラースペースをリニアに変換する必要があります。そうしないと色が正しく再現されません。カラースペースを変換する方法、詳しくないのでよく分からないのですがフィルタの「カラープロファイルコンバータ」とか?

設定があっている自信はありません・・・。

【検証3】CG側で保存する際に、ガンマ2.2の補正をかけて保存。AEの設定はデフォルト

3dsMAXとAEの場合、個人的にはこの方法が結構曲者だと思ってます。LFWが注目され、ブログを始め、結構色んな所で見かける方法ですが。まず、MAXですが、保存時にガンマかけると標準機能でやってもVrayでやっても、αチャンネルにもガンマをかけてしまうっぽい。これが、プリマルチされた後に行なわれるっぽいので、コンポジットソフトで合成した際にエッジ部分など不透明なところが正しく合成されなくなってしまったり・・・。そもそも、画像処理の世界ではαチャンネルはリニアとして扱う事がほどんどだった気が・・・。MAXさん何してるんですかね?


しっかり検証した訳ではないのですが、αチャンネルにもガンマ補正をかけているのではなく、どうやらαはリニアのままでプリマルチした画像に対してガンマ補正をかけて保存しているっぽいです。プリマルチした後のカラコレは、基本的には画像処理的にはやってはいけない行為なので、コンポジットソフトなどに持ち込んだ際、エッジ部分などが正しく合成できなくなります。(画像処理の知識があれば対応は可能)

その辺はHidetake Miyajimaさんがブログで分かりやすく説明されています。
[3ds max] V-Rayで生じたフリンジについて調べてみました


MAXでの設定
ガンマ2.2のViewLutでレンダリングを確認。保存時はガンマ2.2用の補正をかけ保存
レンダリング結果


Beauty
Fogなし
Fog
そして、AEでの合成結果
AEでの合成結果
MAXでのBeauty
 少し分かりずらいかも知れませんが、Beautyにならなくなってしまいました。

通常だとややこしくなるので加算で解説

MAXで起こった事は
 Beautyは A+B とした後にガンマ2.2用の補正をかけてます。

一方、AEで構築するさいは
AとBにそれぞれ補正がかかって保存されているので・・・・

ガンマ補正がかかったA + ガンマ補正がかかったB
 
となり、MAX内の計算と違う結果になってしまいます。

実際に計算してみると、
A = 0.5 B =0.5の場合MAX内は
pow ((0.5+0.5) , 0.4545) = 1.0

AE内は・・・
pow (0.5, 0.4545) + pow (0.5, 0.4545) = 1.45948

MAXより高い数値になってしまいます(AEの加算が明るくなりすぎる原因。また現実世界やCGの世界の光は0.5+0.5=1.0となるので、光を扱う計算としてはあまり好ましくないと言える)


対処方法は色々あるのですが、この場合の一番簡単な方法は「一度リニアに戻してから合成して、またガンマ補正をかけるモード」にするという方法。


こうする事でMAXのBeautyとほぼ同じ結果が得られます。他だと一度「カラープロファイルコンバーター」 で一度リニアにしてから合成して最後に、sRGBに戻してあげるとか・・・。

では、通常で合成したときに何が起きたのかちょっと本気で計算式と睨めっこしてみます・・・。テクニカル泣かせ・・・。数学駄目なので、間違ってるかもしれませんが・・・まず、MAX側のBeauty。

O = pow(A+(B*(1-a)), 0.4545)

AEで背景に霧をのせた時に起こっている事・・・。

O = (pow(A, 0.4545)*pow(a, 0.4545)) + (pow(B, 0.4545)* (1- pow(a, 0.4545)))

かなり・・・目眩がしました・・・。αチャンネルにもガンマ補正かかってしまっているので、色々ヤヤコシイことに・・・。これに、マスク処理とかプリコンプとか関わってくると・・・もう、他ソフトで再現するの嫌です・・・。


CGの画像にガンマ補正をかけてしまって、さらにややこしくなるのは、VelocityやDepthやNormalMap等の扱いです。CGソフトの色んな数値を画像として保存して、コンポジットソフトに持っていくのですが、ここでガンマがかかっていると・・・。さらに、整数型の画像フォーマットを使う再にはnormalize等の問題もあり・・・。コンポジットする前提のCG素材にガンマをかける行為は、個人的にはあまり理にかなっていない気がします。コンポジット上で正しく計算するためには、結局またリニアに変換する事になりますし・・・。
そのような理由もあり、リニアワークフローを導入する際は、テクニカルに強いスタッフに協力してもらうか、よく分からない場合はまず素直にCG、AEともにガンマをかけずに32bitFloatで作業する事をお勧めします。

※カラースペースと計算式、意識して行きたいですね。日本国内の映画の仕事などで、デフォルト設定のままのAEでDPX、exr、SGIなどをカラースペースも変換せず、一番上にcineonLogをいい感じに見えるような調整レイヤーをのせているAEのコンポジットを見ると、血の気が引きますし、他のソフトとのコミュニケーションが非常に困難なものになります・・・。コンポジットソフトをAEしか触った事がない人が組みがちなコンポジットです。AEしか触った事がなく「コンポジター」と名乗ってる人は危機感を持ってください。今後、色々対応できない事が出てくると思います。少なくとも僕はCGのアーティストです。コンポジターと名乗る以上、僕よりコンポジットの知識がなくては困ります。是非、一度NukeのPLEでもいいので、合成の基礎を学んでみてください。AE以外のコンポジットソフトは計算式を意識させられる仕組みになっています。 Nuke101はNukeの機能紹介がメインの本ですので、合成の基礎を学ぶにはあまり向いていないかもしれません・・・。逆に、CGの人もコンポジターからシェーダーなどについて聞かれる機会が増えるかもしれません。僕がNukeを触れて良かったと思う事は、コンポジットは綺麗な画を作る事はもちろんですが、画像処理であるという事に気付けた事。

合成の最も基礎となるOverの計算式について

Nuke等のコンポジットソフト、AE以外と言ってもいいと思いますが、コンポジットの精度が非常に高く、例えば「通常」で霧を合成した場合、逆算する事でFogをかけない状態の元の画像に戻せたり・・・。このような時も、画像にガンマがかかっていると計算が凄く大変だったりする。
BとAからフォグなしの素材を作り出せる

AEとMAXはマニュアルに計算式とか特にないので、改善して欲しいですね。

【MAXのセラックマテリアルのマニュアルの説明の例】
セラック マテリアルは、1 つのマテリアルの上にもう 1 つのマテリアルをスーパーインポーズして 2 つのマテリアルをミックスさせます。スーパーインポーズされたマテリアルの色はセラック マテリアルと呼ばれ、基本マテリアルの色に追加されます。[セラック カラー ブレンド]パラメータはミキシングする色の量を制御します。


ミックス、ブレンド、追加(加算?)、スーパーインポーズ?非常に分かり辛いです・・・。ミックスとブレンドは同じ?加算してるの??となる・・・。検証してみたら、ただのMix(Add)っぽいですが・・・。ちなみにリニアワークフローで安易にセラックマテリアルを使うと、反射率200%の物体が誕生します。なれない内は素直にVrayやMentalray専用マテリアルを使っておくといいと思います。

追加:AEには画像のデータを変換かけずに、そのまま読み込む設定もあります。覚えておくといつか幸せなことがあるかも










【まとめ】
 AEの描画モードは8bitとか32bit floatとかで計算式が変わる訳ではないので、ガンマと計算式を意識すれば、精度は落ちるものの8bitでもリニアのコンプは可能。sRGBのカラースペースはモニターで正しく色を再現するためのものであり、コンポジットには向いていない。DPXなどのlogも同じく、これは本来フィルムのデータを扱うためのフォーマット。そして、正確にはsRGB = ガンマ2.2ではないらしいです。今回の説明では明確に区別しなかったのですが、AEでカラープロファイルを操作する際に注意が必要です。デフォルト設定のAEは「作業用カラースペース」がsRGBになっているので、CG側でガンマ2.2の補正をかけsRGB用のフォーマットに保存した場合、AE側で正しくデータを再現出来ないケースが出てきます。

sRGB         x<.04045 ? x/12.92 : pow((x+.055)/1.055, 2.4)
Gamma2.2    pow( x , 2.2)

また、RGBの色再現まで考えるとcolor matrixを使う必要があるようです。ガンマとカラースペース(色空間)はまた別の話だそうです。後、個人的に気になったのは整数によるコンポジットの画像処理の精度です。アーティスト目線だとマッハバンドが出なければいいや。位なのですが、数値がどう変化するのか検証してみたいです。場合によってはAとBを合成するというシンプルな処理をしただけでも、数値が変わってしまうケースがありそうな気がしていて・・・。 今までは気にならなかったのですが、Nukeのコンポジットの精度を体感してしまった今はとても気になります。出来るだけ正しく画像処理がしたい。
--------------------------------------

今回はFogで説明しましたが、シェーダーの仕組みについては、北田さんのブログが分かりやすくてよいです。

【CG】 Shader type について

ここに載っているようなことをコンポジットで再現する際にもリニアだと同じ計算式で再現出来るのでとても簡単です。

今回はCGの素材のみの説明でしたが、実写素材に関しても同じです。撮影してきた素材の光の情報をそのまま扱えるという意味でもコンポジットをリニア環境で行なう事は非常に理に適っていると思います。

CGの作品ではありますが、PPIさんの「TORN UPRISING」はコンポジットにNukeを使われているという事で、ほぼ間違いなくリニアライトスペースでコンポジット(撮影)を行なっていると思います。理論的には昔のアナログ撮影に近い処理がコンポジットでされているという事になり、アニメ製作の技術としても非常に興味深い作品です。これを期に、アニメ業界の方もリニアワークフローに興味を持っていただけたらと。

ちょっと駆け足でブログ書いたので確認して間違っているとこなどは、また暇な時にでも修正します・・・。 ご指摘いただけると嬉しいです。

The Art of Digital Color - fxguide

0 件のコメント:

コメントを投稿