株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 物理ベースライティングのおともに

物理ベースライティングのおともに

2013/7/22

Tag: ,,,,

みなさんはじめまして。
今年からTDチームに参加してます、伊藤と申します。
このごろはなんだか、ブラウザからアクセスするなんやかんやをいじることが多くて
日に日にMayaの画面をみる時間が短くなっている気がする僕ですが、
そんな中、先日ライティングに関するお題に取り組みましたので今日はそれを紹介したいと思います。

リアルな画作りに欠かせない「物理ベース」の考え方ですが、ライティングに関して言えば、
光は光源からの距離の二乗に反比例する(減衰する)ことを考慮する必要があります。
Mayaで言えば、ライトのDecay Rateを「Quadratic」に設定することでこれを再現できますが、
ここでひとつちょっとした問題が発生します。
「距離の二乗に反比例して光が減衰する」っていうのが、作業上どうにも把握しづらいという問題です。
ライトから遠かったら暗くなるのは分かるんだけど、これだけ離れてるココはどれくらいの明るさ?
このオブジェクトのこの部分は、いま一体どれくらい照らされてるのかな?
というのが分からなければ、悪くすると目あわせで作業を進めてしまって、
光が当たりすぎ/光が足りない状態で質感調整しちゃったなんてことも起こりかねません。
そこで、ごく簡易なものではありますが、どれくらい照らされているか=照度計算をする
エクスプレッションを書いてみました。

ベースになる式はコチラ↓

照度=光源の光量/(距離x距離)

ここでは光源としてポイントライト「pointLight1」、測りたい照らされている位置を指し示すために
「locator1」を用意し、さらに計算結果表示用に、pointLight1に「Measure」というアトリビュートを
追加しています。
実際のエクスプレッションはこんな感じ。

float $distX = abs(pointLight1.translateX - locator1.translateX);
float $distY = abs(pointLight1.translateY - locator1.translateY);
float $distZ = abs(pointLight1.translateZ - locator1.translateZ);
vector $distV = <<$distX, $distY, $distZ>>;
float $dist = abs($distV);

pointLight1.Measure = (pointLightShape1.intensity / ($dist*$dist));

▼Expressionの内容がシーン内のどこに対応しているかの図

今回は、Intensityをいじりながらチェックするためにライト側にMeasureアトリビュートを追加しましたが、
ロケータを移動させながらチェックするためにロケーター側にアトリビュートを設けてもいいかと思います。

ちなみに、エリアライトに関しては
Intensity以外に面積(スケール)によっても照度が変わるのですが、
照らされるオブジェクト側にmia_materialなど
Mentalray用シェーダがアサインされている場合には、
仕様上スケールによる照度変化は考慮されないようです。
V-Ray Rect LightでV-Rayを用いたレンダリングではスケールも考慮されますが、
光源が面積を持っている場合の計算はだいぶ踏み込んだ内容になってしまうので、
ここでは割愛させていただきます。

● 確認してみる

ついでに、エクスプレッションでの計算結果と
レンダリング結果があっているかチェックする方法についても、軽く触れておきたいと思います。
先ほどのような仕込みを済ませたライトと同じ位置、同じ向きのカメラを用意し、
チェック用のプレーンを作成します。
さらにmia_materialを追加し、Colorを HSV=(0.0,0.0,1.0) に、Reflectivityを 0.0 に設定、
さきほどのプレーンにアサインしましょう。

ライト(+カメラ)とプレーンとの 距離が10 離れた状態で、
ライトの真正面の点の 照度を1 にしたい場合、
ライトの Intensityを100 に設定してレンダリングします。
(エクスプレッションの計算結果として、Measureアトリビュートに 1 と表示されるはずです)

レンダラーはMentalrayを指定。
ファイル形式は、ここではDFでよく使われているOpenEXR( RGBA(Half)4*16bit )にします。
Color Managementを有効にし、Default Output Profileが「Linear sRGB」であることを確認します。
それから念のため、Default Lightのチェックははずしておきましょう。
▼ Mentalray,OpenEXR (Color Management ON/ Default Light OFF)

▼RGBA(Half)4*16bit

レンダリングした画像の確認には、Photoshopでもいいのですが、
Maya付属のMentalray謹製ビューアー「imf_disp」もおすすめです。
2012以前なら “(Maya2012インストールフォルダ)\bin\imf_disp.exe” に、
2013以降は “(同2013)\mentalray\bin\imf_disp.exe” に収録されています。

またPhotoshopでチェックする場合、値を 0-1 で確認するために
情報パネルのスポイトアイコンをクリックし「32bit(0.0-1.0)」を選択します。(→)

開いた画像の中心近辺をピックしてみると、値が 1.0 になっていることが確認できると思います。

こうした方法でニュートラルな照明を用意すれば、
合理的で後々トラブルの元になりにくい物理ベースなライティングに
一歩近づけるのではないかと思います。
もちろん、こんな簡単なのもうやってるゼという方もおられるかと思いますが、
まだという方はぜひ試してみてください。

それでは、また。


※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください

Pocket

コメント

[…] ものすごく単純なことですが、ルックデブを行うにはすごく重要なことです。 減衰有りのライトでIntensity”1″を探るには物理ベースライティングのおともにで紹介しているツールが便利なので合わせてご覧ください。 […]

1 thought on “物理ベースライティングのおともに”

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*