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

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

2013年11月18日月曜日

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

木村でございます。前回はライティング作業に入る前の下準備として、リニア・ワークフローのお話をしましたが、その後お読みになっている方から有益なご指摘をいただきました。まずsRGBのガンマに関して、Mayaのソリッドなカラー(カラーピッカーから得た色)をリニア・ワークフローに組み込むために、Gamma Correctノードを用いるお話をしましたが、ご指摘によるとsRGBは厳密には2.2のガンマではないので、0.45の逆ガンマをかけてもリニアにはならない、ということです。参考に紹介して頂いたサイトによると、特に暗部での誤差が大きくなる、という指摘が出ています。残念ながら、私の理解ではMayaのカラーピッカーの色を単純にリニアに戻す方法は提供されていないので、依然としてGamma Correctノードを使うしかありませんが、この点に関してはMayaユーザーは留意しておくべきでしょう。

次に、投稿した文中で16bitの意味がちょっと分かりづらい、とのご指摘を頂きました。この辺は私、floatであるということは記載していましたので、読んでおられる方々がわかっているものとして話を進めてしまいましたが、やはり整理しておいた方がいいでしょう。大体CGで扱われる画像のビットデプスとデータ・タイプは、以下のように分類されるかと思います。
  • 8bit - integer
  • 16bit - integer
  • 16bit - float (half)
  • 32bit - float
前回の投稿で私が頻繁にお話ししておりました16bitは、3番目の16bit float (half)になります。halfとつく理由はfloat(浮動小数点)型は本来32bitだからでして、その半分なのでhalfと言われている訳です。そして、私の理解ではこのタイプの画像を保存できるフォーマットは現状Open EXRのみかと思います。HDRIの画像フォーマットとして有名なHDRフォーマットはfloatですが32bitのみです。ちなみに、プログラミングの世界においては64bitの浮動小数点型も存在し、これはdoubleなどと呼ばれますが、画像を保存するデータ・タイプとしては一般的には使われていません。PhotoshopやAfter Effectsなどでは8bit, 16bit, 32bitで画像を扱うことができますが、このうちfloat型なのは32bitだけであり、16bitは上の表の2番目、integer(整数)になります。また、Mayaでもビットデプスを指定するパラメータ(Framebuffer)に16bit (half)と16bit (short)という2つがありますが、16bit (short)は整数です。8bitよりも大きい数なのにshortと呼ぶのは奇妙な気がしますが、これもやはりプログラミングの世界では整数は32bitが標準の精度であり、それよりも短い16bitをshort integerと呼ぶところからきています。実はこの浮動小数点と整数の違いは重要ですので、ライティングのお話の中で実際に例を挙げてみていきたいと思っています。

さて、いよいよ実際のライティングのお話しになりますが、実はライティングのやり方はここ数年ばかりでかなりかわってきました。これはレンダリングにグローバル・イルミネーションが用いられることが一般化してきたこと、ビットデプスが深く、ダイナミック・レンジの高い画像を保存できる画像フォーマットを利用するようになってきたことなどが大きく影響していますが、端的に言えば、より物理特性にそった、現実に近いライティングをするようになったということになります。例えて言うのであれば、かつてのライティングがより絵画的(ライティング・アーティストの職人芸で、見た目から光と色が決められる)であったものから、より写真的(照明や物質の質感パラーメターをより現実の尺度に近く考え、適切なセッティングをしてやることでリアルな絵を作る)になってきている、と言ってもいいかもしれません。これはもちろん表現媒体にもよりまして、フィーチャー・アニメーションなどでは依然として絵画的なライティング望まれる傾向がありますが、少なくとも実写映画のVFXでは明らかに写真的なライティングが求められます。これは演出の仕方にも明らかにその傾向が見られ、例えばアメリカのプロダクションでは、ライティングのデイリーやディレクターズ・レビューなどでは、明暗の調整を指示するときなど、一昔前は「ここを20%位暗く」とか、「1.5倍くらい明るくして」などといった指示の仕方が普通でしたが、今はもっぱら「Half Stop位明るく」とか「2 Stop暗くして」などといった指示のされ方をします。このStopという表現は私の以前の投稿「写真を撮ってみる その3」でご説明しましたが、結局のところこれはライティングの仕方が実際にそうなてきているからでして、以前写真を撮るお話を長々としたのも、これを前提としてお話を進めていかなければならないからなわけです。

イメージ・ベースド・ライティング、及びインダイレクト・イルミネーションとハイ・ダイナミック・レンジ

近年のVFX向けのCGのライティングではもはや標準といっていいライティング・テクニックが、イメージ・ベースド・ライティング(IBL)とグローバル・イルミネーション・レンダラを用いたインダイレクト・イルミネーションです。IBLはハイ・ダイナミック・レンジ・イメージ(HDRI)をライトソースとして使うライティング・テクニックであり、この分野の先駆けであるPaul DebevecがSIGGRAPHなどでそのテクニックを公表し、一気に広まりました。IBLのミソは画像が単に色情報のみならず、輝度情報を保持することでライトソースとして挙動する、という点でして、光源(太陽や照明)と環境との著しい輝度差の情報を可能な限り保持することにより、リアルなライティングが可能になる訳です。

また、光源が他のジオメトリにヒットし、その反射が間接照明として輝度計算に寄与するインダイレクト・イルミネーションにおいても、他のジオメトリからの反射というきわめて微妙な輝度情報を保持するためにはダイナミック・レンジの高いフォーマットで画像を保存することが重要になります。現実の写真が適切なカラー・グレーディングをするためにRAWフォーマットを必要としているように、CGでもビットデプスの深い画像がそのディティール情報を残すために必要とされてくるようになった訳です。

シェーディング・モデルとレイ・トレーシング

CGのライティングに関してよく聞く言葉にBRDF (Bidirectional Reflectance Distribution Function) というものがあります。これは非常に単純に言い表すと、物体がどのように光を反射するかをモデル化したもので、PhongやBlinnがそういったものの代表格にあたります。こうした今までCGでよく用いられてきた反射モデルは計算を単純化するため、ある程度フェイクのテクニックを多用してきました。例えばこうした反射モデルでよく表現されるスペキュラーは光源の反射を表現するためのフェイクであり、今までCGにおける光源の存在が単なるパラメータの集合体でしかなかったケースでは、これが有効に機能していた訳です。しかしIBLやGIを始めとして「光源そのもの」が映像のリアリティに貢献するようになってくると、こうした単純な反射モデルでは不十分と考えられるようになり、実際のCGソフトでも様々なアプローチでこれを改善しようという試みがなされてきました。今回私が作例で使ったmental rayにもmia_materialという、従来のMayaやmental rayのシェーダーよりもより物理特性に近いアプローチを試みたシェーダーが実装されています。

下の図は従来のBlinnシェーダー(左)とmia_material(右)を比較したものです。反射がよりリアルになっていることがお分かりかと思います。




このように反射モデルがリアルになってきていることから、IBLのみでライティングをする、というアプローチも出てきました。HDRI Light Studioという市販ソフトがあるのをご存知の方もおられるかと思いますが、これがそういったものの代表格です。このソフトはHDRIを、実際にそれをIBLとしてライティングしながら、インタライクティブに作成していくソフトで、実際にこれだけでライティングをするのは映り込みの強い工業製品の商品映像のようなものが中心ですが、こういったライティング・ワークフローを持ち込もうというアプローチは増えています。

また、従来のようなCGの光源を使う場合でも、反射モデルを考慮して「ライトを実際にシーンに存在させる」というアプローチもとられるようになりました。HDRLabsはHDRIのサイトとしては比較的有名で、豊富なサンプルやフリーの素材もある優良サイトですが、ここにCGの「ライト」としても使えるHDRIのサンプルがあります。ページの下の方に行くと、Lightsmith CollectionというHDRIのテクスチャとライトのモデル・データがセットになったサンプルがダウンロードできるようになっています。

http://www.hdrlabs.com/sibl/archive.html

また、A&G Tool Companyはこうしたライトのリグをライブラリとして販売しています。

http://www.agtoolcompany.com/ag2/the-studio-light-rig-2/

こうしたアプローチではHDRIのもつ輝度情報がシェーディングに重大な影響をもたらすため、とりわけ注意が必要です。今回のお話の始めの方で16bitがinteger(整数)かfloat(浮動小数点)かの違いが重要である、というお話をしましたが、実際に以下のサンプルをご覧頂きましょう。



左がinteger (16bit TIFF) 、右がfloat (16bit EXR)の画像をIBLとして用いたものです。左の画像の、球体のリフレクションの最も明るい部分がクランプされているのがお分かりかと思います。これは整数の画像フォーマットでは、0から最大(16bitでは65536)の間でその値が0-1までの値に正規化されてしまうためで、色のレンジは広いものの、輝度(露出)を保持しておくことができないことに由来しています。これに対してOpen EXRのようなフォーマット(右画像)では、フォーマットのデザインに露出情報を保持することが始めから織り込まれています。Open EXRの公式ページによると、16bitのうち、1bitが符号に、5bitが露出に、そして10bitが実際の色情報の保持に割り当てられ、30-stopの輝度情報が保持可能とされています。すなわち16bitのEXRは厳密にはfloatというよりも最も効率よくHDRIを保存するために考えられたフォーマットと言っていいでしょう。

次回は実際の作例がどうライティングされたかをお話ししていきたいと思います。

3 件のコメント:

  1. 勉強になります、ありがとうございます。
    一点気になる箇所があったので指摘させてください。

    > 16bitのうち、1bitが符号に、5bitが露出に、そして10bitが実際の色情報の保持に割り当てられ、
    > 30-stopの輝度情報が保持可能とされています。すなわち16bitのEXRは厳密にはfloatというよりも
    > 最も効率よくHDRIを保存するために考えられたフォーマットと言っていいでしょう。

    half floatの5bit部分は「仮数」、10bit部分は「指数」で、これ自体で一つの数値を
    構成します。(符号、仮数、指数がどう実際の浮動小数値に変換されるかはwikipediaで
    浮動小数点数のページを見ていただけるとわかります)
    与えられるbit幅が異なるだけで、考え方自体はsingle precision floatと変わりが
    ありません。

    # もし、私が文章を把握しきれていなかったらごめんなさい。

    返信削除
  2. > 5bit部分は「仮数」、10bit部分は「指数」
    すいません、 5bit部分は「指数」、10bit部分は「仮数」の間違いでした…。

    返信削除
    返信
    1. おお、そうでしたか、わざわざご指摘ありがとうございます。結構適当なこと書いてましたね、参考になりました。

      削除

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