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

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

2013年12月26日木曜日

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

木村でございます。数日前に日本からアメリカに戻ってまいりました。日本へは以前もお話しした通り仕事で行っていた訳ですが、仕事の合間を縫って旧友と食事をともにしたり遊びに出かけたりと、楽しい3ヶ月でした。仕事場に遊びに来るよう誘ってくださった方もいて、今の日本の業界事情などを聞き、仕事のお誘いなども頂いたので、日本でまた仕事をすることもそう遠くない将来にあるかもしれません。

帰国中楽しみだったのは食べ物です。仕事場が東京の中野にあったため、昼食は中野近辺で毎日のように違う店を選んでとっていたんですが、それでも到底全部制覇することは出来ませんでした。あれだけ店があってやっていけるのも不思議ですが、大概どこで食べても美味しかったのも驚きです。たぶんアメリカに住んでいるうちに味覚が後退してしまったせいもあるのかもしれません。

それはともかく、ライティングのお話の4回目です。ライティングをつめていくにあたっては、オブジェクトがどういう質感(マテリアル・シェーダー)を持っているか、ということが重要になりますので、今回はそのお話をさせて頂きましょう。

BRDF

前回BRDFというお話をしましたが、若干わかりずらかったかもしれませんので、これに関してもう少し説明をしたいと思います。前回同様、mental rayのシェーダーmia_materialを例にとります。このシェーダー、Mayaの標準のPhongやBlinnといったシェーダーに比べるとアトリビュートの数がはるかに多いので、何をどう手をつけたらいいのか迷うかもしれません。まずは一番基本となるDiffuseから見ていきたいと思います。


上の画像はDiffuseのセクションにあるRoughnessというパラメータを0(左)と1(右)にセットしたものです。ちょっと見た目わかりにくいですが、このパラメータはDiffuseの減衰の急激さをコントロールするもので、デフォルトの0で最も急激に、1で最も緩やかに減衰します。 Diffuseの反射は物体表面のきめの細かさによってその減衰に変化が生じるため、それが荒い物体ではこのRoughnessを0よりも大きい値にセットすることでその質感に近い反射を模倣できます。人間の肌では、大体0.3くらいがいい、などと言われます。


次に鏡面反射、すなわちReflectionですが、一番左は単純にReflectivityを0.6にセットしただけで、他はデフォルトのままです。Phongや Blinnシェーダーでもこのような結果になると思います。真ん中の絵はGlossinessというアトリビュートを0.3にまで下げたものです。このアトリビュートはリフレクションのシャープネスをコントロールするパラメータで、1以下の値に設定することで、表面のきめが粗い物体への映り込みを模倣することが出来ます。その際、レイトレースのサンプリング値がクオリティに影響しますので、Glossy Samplesの値を上手く調整してください。一番右の画像ですが、これはBRDFというセクションにあるアトリビュートの調整結果を表したもので、フレネル式に基づいて反射の振る舞いをきめるためのパラメータになります。このフレネル式、実際には非常に複雑な公式なのですが、CGの場合は単純化された計算式を用いることが多いそうです。その振る舞いを非常に単純に言ってしまうと、面の向きと視線のベクトルから反射係数の度合いをきめるというもので、例えば水面を見ていると、視点が水平に近づくにつれて反射が強く見え、逆に水面下の透過が見えづらくなりますが、あれがまさにフレネル式で表される現象ということになります。

この反射率が変化する度合いは物体によって異なるため、mia_materialではユーザーが任意に減衰の最小、最大値と減衰カーブの変化率をコントロールするアトリビュートを提供しています。サンプルの絵の一番右側のものは、Reflectivityを変えずにこのBRDFのアトリビュートをコントロールしたもので、0 Degree Reflectionを0.1に、90 Degree Reflectionを1.0に設定しています。人間の肌の場合、Reflectivityをもっと下げる必要がありますが、このような反射モデルを使ってレンダリングすることで、スタンダードのPhongやBlinnにはないリアリティを生む表現が可能になります。

サブ・サーフェース・スキャッタリング

mental rayにはSSS(サブ・サーフェース・スキャッタリング)を物理的になるべく正しく計算するシェーダーも備わっていますが、計算コストが高くつくことなどから、擬似的にこれを表現するシェーダーが別に提供されています。特に人間や動物の肌用にはmisss_fast_skin_mayaが古くから利用されていますが、このシェーダーはすでに設計が古いため、misss_fast_shader2などが新たに提供されています(misss_fast_skin_mayaの直接の後継としてmisss_mia_skin2_surface_phenなどもあるようですが、Mayaでは正しく動作しないようですのでここでは触れません)。misss_fast_shader2の最大の特徴はScatter Radius(透過した光が広がる範囲を定義するパラメータ)をRGB各要素毎に定義できることで、これにより光が物体を通り抜ける際の各色要素の波長の違いを模倣することが出来ます。misss_fast_skin_mayaでは単純にScatter Colorに赤やオレンジの色を指定することで肌の薄い部分で血管が透けて見える様な表現を模倣していましたが、これよりはややリアリティのある手法と考えていいでしょう。また、misss_fast_skin_mayaではSSSの減衰カーブがリニアでしたが、misss_fast_shader2では指数関数的に減衰していきますので、この点においてもよりリアルなはずです。

1つ注意しなければならないのは、mental rayのシェーダーにおいて距離を指定するパラメータです。misssシリーズではScatter Radiusがこれにあたります。mental rayではデフォルトの距離のユニットがmmになっているようですが、多くのMayaユーザーは距離のユニットにデフォルトのcmか、場合によってはもっと大きな単位を使っているでしょう。この場合、misssシェーダーにセットされているデフォルト値は明らかに大きすぎる値になってしまいます。例えばmisss_fast_shader2のFront Sss Radiusはデフォルト値がRGBでそれぞれ20, 10, 5ですが、これがMayaのデフォルトの単位cmで解釈されると、Rが20cmですから下手をすると顔の反対側まで届いてしまいます。ですからこれらのパラメータはユーザーが使っている単位に応じて相応しい値に変更するべきでしょう。また、Algorithm controlセクションにあるScreen Compositeはリニア・ワークフローを使っている場合は、必ずオフにしてください。これはSSSの値をシェーディングの最終値に加算する場合、1を超えないように合成するアルゴリズムを使う、ということなのですが、リニア・ワークフローでは不要です。

misss_fast_shader2ではDiffuseやSpecularを他のシェーダーが計算した結果を受け取るようになっており、そのスロットが用意されていますが、今回の作例ではmisss_fast_shader2の出力値を逆にmia_materialに入力する形をとりました。mia_materialのAdvancedというセクションにAdditional Colorというスロットがあり、misss_fast_shader2をこのスロットにさすことで、mia_materialがSSSの値を受け取れるようにしています。下の動画は最終的にセットアップされたスキンシェーダーが光に対してどう反応しているかをチェックしたものです。



次回はライトそのもののセットアップと、レンダリングについてお話ししたいと思います。

0 件のコメント:

コメントを投稿

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