2012年10月22日月曜日

リニアワークフロー tonemapping

Alexa、F65、RED等は精度の高いSceneLinearでの現像が可能です。

ここでは一般的なカメラを想定して話をします。
まず、お手軽にCanonEOSを使ってワイキキビーチ等で撮影を行いjpgなどで保存します。


これにCGを合成するためにNukeに読み込みます。
sRGBのガンマ補正がかかったデータ
ガンマ補正がかかっているのでリニアライズします。

CG素材を準備します。
今回、HDRの撮影を行ってないので適当なHDR素材を準備。CGskiesとかそんなサイトさんから購入しました。


これを使い、チャート基準で露出をだいたい合わせてIBLをしてレンダリング。(太陽の輝度が足りていなかったのでNukeを使って太陽を加工して非常に高い輝度を持たせてあげました。一般的なHDRIの作成方法だと、太陽の輝度が高すぎるため、センサーが値を拾えず数値が足りていない事がほとんどなので、今回のように加工するかCG側でライトを追加する必要があります=屋外のHDRIを使ってIBLをした際、上記のような理由でいい感じでレンダリングされる事があまりない。その際、加工するのは露出やガンマではなくて、まず太陽)
CGのレンダリング結果

合成



今回はチャートの白で露出を合わせたのですが、CGのチャートがくすんで見えます。白い球の陰影もどこか不自然に見えます。

HDRIはSceneLinearの精度が高い素材とされています。CGに関してはレンダリングは計算なので完全なSceneLinearと言ってよい状態です。なぜ、馴染まない?答えはカメラが画像を作成する工程にあると考えられます。

カメラのセンサーが拾ったデータ(RAW)入れるの忘れてました。RAW→CIE XYZとかだと思われます
詳しく分からないのでイメージで話しますが、一般的なデジタルカメラは多分上のような工程でjpgやQT等の画像を生成していると思われます。最後にいい感じに見えるカーブがかかり、これによりカメラごとの特徴「Canonのカメラはいい!」みたいな味付けとかをしていると思われます。また、物理的に正しいデータをそのままPCのモニタに表示すると自然な感じに見えないので、自然な感じに見えるようなカーブを適用していると思われます。sRGB(Linear)にgamma2.2のような事で作られることは稀だと思われます。このいい感じに見えるように画像を処理する事をtonemappingと言います。

つまり、今回のケースの場合はCGにはtonemappingがされていない物理的に正しいデータ。一方、実写はtonemappingがされていい感じに見えるように修正されているデータ。NukeでsRGBとしてリニアにしていますが、厳密にはtonemappingの影響で完全にはLinearにはなっていなかったという事です。一般的なカメラを使った場合、大抵このような事になると思います。そして、お互いを合成した時にtonemappingがされていないCGの方が不自然に見えてしまいます。(実写を精度の高いSceneLinearの状態にしたい場合はメーカーなどから計算式などを入手する必要があるという事です)
ちなみに、実写が精度の高いSceneLinearな状態で現像出来ていれば、CGを合成しただけで結構馴染んで見えます。

今回撮影に使ったカメラにどんなtonemappingがされているか確認してみます。

Pythonで実写とCGのカラーチェッカーのGreyの数値を比較してcolorlookup(トーンカーブ)に反映させてみました。(今回HDRを違うものを使用していたり等いろんな精度の問題がありますが、雰囲気という事で) x-riteの純正ツールを使う方法もあるかもしれません。

結果。CGにS字のトーンカーブ当てる事が多い皆さん、間違ってません。今すぐLWFに切り替えましょう。また、今回のカーブはSceneLinear用のカーブなのでsRGB環境のカーブとは形が違います。参考にする際は注意して下さい。
CGにこのカーブを適用して合成

左:CGそのまま 右:CG+tonemapping
 こんな感じになります。
 一つ抑えておきたい事はCGのレンダリングは特別な設定をしない限り、基本的にはtonemappingがされていないという事です。でも、物理的には正しいと言えるデータを出力しています。ワークフローにもよるとは思うのですが、そのままアーティスが作業すると、自然に見えるようなシェーダーやライティングやレンダリング設定をしてしまうことも考えられます。SceneLinearの状態が損なわれてしまいます。1つのプロジェクトで完結するような場合は大きな問題にはなりませんが、他プロジェクトで使いまわす際などに、カメラが変わりtonemappingが変わってしまうと、再び調整が必要になってしまいます。そこで、レンダリング結果を確認する際にtonemappingを適用して確認するようにするのもいいかもしれません。保存時適用するかしないかは、ワークフローによると思うのでどちらでもよいと思います。また、CGのチャートの両脇のグラデーションは「0、25、50、75、100%」の黒色です。注意してほしいのは0%の黒です。画像のように真っ黒になります。テクスチャーで0黒使う際は注意して下さい。また、チャート下の段の一番右側のBlackは約3%の黒です。0~3%の黒の違いにも気を付けてください。たった3%ですが見た目に大きな違いがあります。

CGにリニアワークフローを導入した際に足りない要素ですね。「物理ベースなはずなのに何か自然に見えない」。CGのレンダリングは物理的に正しいデータを出力するのが得意なので、CGの作業はほどほどにして、後はtonemappingやカラコレをして調整するのが良いと思います。

tonemappingで確認する方法、色んな方法があると思いますが、身近なツールで行う例として。
Nukeで3DLutを作成。各ソフトが対応している形式で出力。V-Rayなら.cube。MAYAは2013とかだとframebufferの設定の所で色々読み込めた気がしました。普段あまり使わないので詳しくなくてすみません。

Nukeで3DLUTを作成
MAX、V-Rayの設定
レンダリングされた浅い画像にtonemappingを適用して確認。いい感じで観察できる

コンポジット時も、やみくもにカラコレが入らず「あ、ここでtoneを合わせたんだな」と分かりやすくなるのでリニアワークフローを導入する際は「tonemapping」意識して行きたいですね。ブラケット撮影を行って数値の変化を測定したり、比較的簡単に作れると思います。また、アーティストの感覚に任せて、魅力的な画像になるように調整してもらっても楽しいですね。tonemappingに関してはHDRIの加工や、ゲーム業界での研究が盛んなようです。そちらを見てみても参考になると思います。詳しく知らなくて申し訳ないのですが、ゲーム業界では五反田さんという方が有名なようです。また、ACESのRRTも非常に魅力的です。FUJIFILMさんが開発に関係しているらしいです。FUJIFILMさんもGJです。

今回撮影に使ったCanonさんは純正のRAW現像ツールを使えば、割と精度が高いSceneLinearの現像が行えます。実写が精度の高いSceneLinearな場合は、実写とCGを合成した後、tonemmapingを適用してあげます。他のカメラの特性が分かれば、他のカメラで撮影されたような画が作れるという事でもあります。ARRIのサイトにはLUTgeneratorがあり、SceneLinearの画像をAlexaのカメラで撮った風とかにも出来ると思います。ARRI、GJです。これは色んな画像を扱うVFX制作では魅力的なワークフローですね!

一方で、「グレーディング」等の要素が絡むと、今回の話がもっと複雑になるのでグレーディング部署とのコミュニケーションも大事にしていきたいですね。特にCMなどは最初にグレーディングされる事が多いので。

まとめ:撮影時にチャートくらい撮っとけ!
参考:http://www.ieice-hbkb.org/portal/doc_551.html

0 件のコメント:

コメントを投稿