ハリウッドVFX業界就職の手引き

ハリウッドVFX業界就職の手引き
鍋潤太郎氏による、海外のVFX業界で働くための手引き。お薦めです。

2013年10月27日日曜日

ライティングしてみる その2

もう10月も終わりですか。すっかり月一更新になってしまいましたが、だいぶ延び延びになった「ライティングしてみる」第2回目のお話をさせて頂きたいと思います。その前にちょっと告知を。私がRhythm & Huesで制作に関わっておりました「パーシー・ジャクソンとオリンポスの神々:魔の海」がいよいよ日本でも11月1日から公開になるようです。多分一作目を観ておられない方でもそれなりに楽しめるはずです。よろしければ劇場まで足をお運びください。


さて「ライティングをしてみる」の第2回ですが、今回はライティングを始めるにあたっての下準備のお話をしましょう。以前お話しした「写真を撮ってみる」というシリーズで何度か触れましたが、今のアメリカのプロダクションのほとんどはレンダリングを8ビットではなく16ビットで行っています。これはもちろん、そうすることでよりダイナミック・レンジの広い画像を扱うことが可能になり、結果としてよりリアルなVFXの制作が可能になる、ということなわけですが、その16ビットの画像を保存するフォーマットとして最もポピュラーなのがILMが策定したOpen EXRというフォーマットです。この画像フォーマットはHDRフォーマットなどと同様、広いダイナミック・レンジの画像を扱うために策定されたフォーマットであり、カラースペースはリニアです。そしてこのことは、最近CG業界でよく聞くようになってきた「リニア・ワークフロー」と密接な関係があります。

この「リニア・ワークフロー」、簡単にいいますと、CGにおいてカラースペースの扱いをワークフローの中で考慮する、ということな訳ですが、そのためにはカラースペースそのものの話を先にしないといけません。伝統的にこれまでCGで扱われてきたカラースペースはsRGBでした。このカラースペースは基本的にガンマ補正がかかったカラースペースであり、RGBそれぞれに2.2のガンマがかけられています。このようなカラースペースが一般化した理由に関しては私も正直詳しくないんですが、昔はビデオ・モニターの表示能力自体が低く画像がちょっと暗かったため、補正をかけて正しくみれるように、ビデオ映像自体にこのようなガンマのかかったカラースペースを適用することが一般化した、と言われています。その後モニターの技術は向上し、正確に色を表示できるようになったものの、既に世間で使われているビデオや画像のほとんどがsRGBで作られているため、今だほとんどのモニターはこのsRGBを基準に正しく色を表示するように作られている、ということです。

ところが近年、画像情報をより正確で緻密に記述できるような方法が模索され、その結果として8ビットよりもビットデプスの深い画像フォーマットの多くがリニアのカラースペースを採用するようになりました。リニア・カラースペースは入力と出力の情報が1対1で対応している訳ですから、最もシンプルでわかりやすい考え方です。本来であればこれで全ての作業をすれば何の問題もなくことが運べるはずなのですが、先ほどもお話ししましたように、既にsRGBが一般化しているCGの世界では、sRGBとリニアのカラースペースを混合して扱わなければならないことになります。そのためのワークフローがリニア・ワークフローという訳です。

カラースペースは、画像ファイルを開くと絵に「これはsRGBです」とか「これはリニアです」とか書いてある訳ではありません。一見ちょっと暗かったり明るかったりするだけで、モニターのキャリブレーションがおかしかったり、アプリケーションがどうカラースペースを扱っているかを理解していないと、非常に混乱させられます。そもそも、カラースペースを混在して扱う、ということ自体がCGのアプリケーションにとっても比較的新しいことであるため、古くからあるCGソフト、AutodeskのMayaのようなソフトでは後付けでカラースペースの管理機能が加えられています。そのため、どうも今一すっきりと統合されていない部分もみられ、これがさらに混乱に拍車をかけています。今回は具体例としてこのMayaを取り上げますが、他のアプリケーションも基本的な考え方は同じです。それぞれのソフトでカラースペースの指定方法は異なると思いますので、それぞれのマニュアルで確認してみてください。

Maya上でのリニア・ワークフロー

まず、CGで扱われるカラースペースがどの時点でどれであるべきか、ということを考えてみましょう。まず入力情報としてはモデルに張るためのテクスチャ・ファイルがある訳ですが、これは多くの場合がTIFF、JPEGなどの8ビット画像であり、これらはsRGBです。また、IBL(イメージ・ベースド・ライティング)のライトソースとして扱われるHDRIは基本的にリニアです。

次に出力ですが、画像を各チャンネル16ビットのRGBA画像として出力してみることを考えてみましょう。当然これはリニアになります。しかし、この出力画像をコンピュータのモニターでチェックする場合、これはsRGBになります。つまり



皆さんが計算している画像はおそらくだいたいこのような流れを経てモニターに表示されることになる訳です。
ちなみに以前買ったダイアグラムを描くソフトは使うのがめんどくさくなってまた手描きに戻ってしまいました。見づらいですがご容赦ください。ではこれはMayaでは実際の所どう扱うことになるでしょうか。皆さんがMayaユーザーであればRender Settingsウィンドウを開かない人はまずいないと思います。その名の通りレンダリングのセッティングをするためのウィンドウですが、ここにColor Managementというコーナーがあることもおそらくご存知でしょう。これがまさにカラースペースを指定する場所になります。ここにあるパラメータ、Default Input Profile は、入力される色情報に特にカラースペースを指定しない場合、デフォルトで設定されるカラースペースが何かを指定します。入力画像の多くはテクスチャであり、これは多くの場合8ビットTIFFのようなsRGB画像ですので、ここはsRGBにしておけば多くの場合問題ないでしょう。


Default Output Profileは出力画像のカラースペースですが、16ビットの画像を書き出す場合、これはリニアになります。Linear sRGBという選択があるはずですので、これを指定します。ここで注意しなければならないのは、出力が16ビットである、ということをレンダラに明示的に知らせることです。カラースペースをリニアにしても、8ビットで書き出しては適正な画像が得られません。MayaではやはりRender SettingsのQuaityタブにFramebufferというコーナーがあり、ここにビットデブスを指定できるようになっているので、ここで16ビット(Float)であることを指定しておきます。

次にレンダリングした画像をMayaのプレビュー(RenderView)でみる場合ですが、ここで出力されたものはモニタでチェックするので、sRGBに変換する必要があります。Render ViewウィンドウのメニューDisplayからColor Managementを選択すると、アトリビュート・エディタにColorManagerノードのアトリビュートが表示されます。入力画像はリニアなのでImage Color ProfileをLinear sRGB、Display Color ProfileをsRGBを指定します。また、やはりRender ViewのDisplayメニューに32-bit floating-point (HDR)という選択肢があるので、これもオンにしておきます。



これでレンダリング時の基本的な設定はすんだことになります。しかし、先にお話しした通り、入力画像のカラースペースは必ずしも一定ではありません。Color Managementに指定されたデフォルトのカラースペースではない場合、これは個別に指定する必要が出てきます。Mayaにはテクスチャを扱うノードにfileというノードがあり、このノードはカラースペースを指定するアトリビュートを持っています。デフォルトのカラースペース(Color Managementで指定したカラースペース)ではない場合、ここで個別にカラースペースを指定する必要があります。ここではsRGBがデフォルトの指定ですから、HDRIなどの画像にLinear sRGBの指定をしなければならないのはもちろんですが、8ビット画像でもリニアの指定をした方がいい場合があります。これはテクスチャの中でも、色情報というよりはCGのレンダリングにおける、特定のパラメータのインテンシティ情報を保持しているようなタイプのもので、おそらく次のようなものがそれにあたるでしょう。

  • バンプやノーマル・マップ
  • ディスプレイスメント・マップ
  • トランスペアレンシー・マップ
  • スペキュラー・マップ
これらは8ビットであってもLinear sRGBを指定した方がいいでしょう。ところで、Mayaにはテクスチャのカラースペースに関して、一つ厄介な問題があります。プロシージャル・テクスチャや、あるいは単純にシェーダーにMayaのカラーピッカーから単一の色を指定する場合、こうしたMaya内で直接指定する入力カラーは自動的にsRGBと見なされるのです。このため、出力がリニアになっている状況ではこれらもリニアに変換しなければならない訳ですが、これらのカラーピッカーから指定する色情報にはカラースペースを指定するパラメータがありません。そこで、やや煩わしいですが、色を指定するにはまずRampノードなどで単一の色を出力するノードを作り、それをGamma Correctノードにコネクトして逆ガンマによる補正をかけ(RGBそれぞれに0.45のガンマをかけます)、その後その出力を実際にその色を使うアトリビュートにコネクトしてやる必要があるのです。これを見落とすと出力が正しくなくなるので、注意が必要です。


このように、リニア・ワークフローはかなり混乱させられる作業ですが、とりあえず始めに頭に叩き込んでおく方がいいでしょう。レンダリングが終わってから間違ったカラースペースを指定していたことが発覚すると、非常に残念な気分になります。では次回は実際のライティング作業についてお話ししたいと思います。

3 件のコメント:

  1. 話を簡略化する為かもしれませんが、ここ学生さんも読んでるかもしれないのでコメントしときます。
    よく勘違いされてる方も多いですが、sRGBのGmmaは厳密には2.2では無く暗部がちょっと異なります。なので単純に逆の0.45のだと微妙にあれ?って事が起きたりします。
    あと16bitについて、ちょっと分かりにくい書き方かな?と思います。
    8bit integer / 16bit Integer / 16bit half float =openEXRをちゃんと書き分けた方が良いかと…

    返信削除
    返信
    1. そうですか、それは知りませんでした。基本的にはここで書いてることは16bit half floatなので、次回から明記しておきます。

      削除
  2. 日本語だとココが分かりやすいです
    http://imeasure.cocolog-nifty.com/blog/2009/11/srgb22-2780.html

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。