チュートリアル / 宋さんの3ds Max キッチンスタジアム
第6回:周囲光 GIフォトンをもっと使おう!
- 3ds Max
- コラム
- チュートリアル
- ビジュアライゼーション
- レンダリング
周囲光(アンビエントライト)
周囲光は、光が当たっていない場所の色を指します。拡散反射光において、光の入射角度がオブジェクトの法線角度からずれた瞬間から周囲光にその領域が支配されはじめます。また、光の入射角度が物体の接線から外れ始めた時点で、すべて周囲光に変わります
現実世界の中で周囲光が全くの0というのはケース的に非常にまれです。完全に遮蔽されて、光を完全に吸収する壁面に囲まれた室内などではありえますが、ライトが少しでも侵入する空間であれば完全な闇は存在しないのが正しいといえます。
光というものは直進していくものですが、同時にあらゆる物体にぶつかり乱反射していきます。その反射物体は固形のものだけではなく、空気でさえその媒体となります。地球は大気で包まれているので、極端な言い方をすれば、太陽から放射された光は大気に侵入した瞬間に空気の粒子で乱反射し続け、地球の裏側まで届いてるという事になります。つまり建築物のようなエクステリアのレンダリングイメージでは周囲光(影)は完全な黒にはならないという事になります。この状態を再現するツールがスカイライトオブジェクトです。

グローバルイルミネーションが一般的になる前は、周囲光にはある程度の値を設定することで、より自然なレンダリングイメージを実現させていました。
しかしながらグローバルイルミネーションを使用した際には、周囲光に関しては完全な黒(RGB値=0)に設定する必要があります。グローバルイルミネーションを直訳すると大域照明という意味です。先程述べました物体を媒体とする光の伝播を視覚化するものですので、計算前は周囲光の値はRGB 0 0 0つまり 黒にしておきましょう。

(図-1)

(図-2)
3ds Maxでの周囲光設定は2段階で行います。ひとつはシーン全体に影響させるグローバルな設定(図-1参照)。
もうひとつは各マテリアル単位で設定する方法です(図-2参照)。
マテリアルによる設定はあくまでもグローバル周囲光の設定値をベースとした相対的な操作になるため、グローバル設定がRGB 0,0,0(黒)の場合はマテリアルでの周囲光の値は機能しません。
もうひとつは各マテリアル単位で設定する方法です(図-2参照)。
マテリアルによる設定はあくまでもグローバル周囲光の設定値をベースとした相対的な操作になるため、グローバル設定がRGB 0,0,0(黒)の場合はマテリアルでの周囲光の値は機能しません。
グローバルイルミネーションでは光の拡散や2次反射を表現する手法ですが、その結果は周囲光に対して光の拡散による要素を加える計算といえます。そういった観点から、この項では周囲光に大きな影響を及ぼすグローバルイルミネーションを中心に解説していきます。
3ds Maxではグローバルイルミネーションのプログラムとして2つの手法を提供しています。
1. ラジオシティ
2. mental ray グローバルイルミネーション(フォトンマップ)
2. mental ray グローバルイルミネーション(フォトンマップ)
えー!? って思われる方もいると思います。ファイナルギャザーやライトトレーサーはGIではないの? と誰もが感じると思いますが、厳密な意味での実際の光の拡散、伝播を計算する手法はこの2 だと思っていただいて良いと思います。
ラジオシティ法とフォトンマップ法はその手法は異なりますが非常に似た考え方で光をシミュレートします。また、ファイナルギャザーとライトトレーサーはパストレーシング法という同じ手法を採用しています。本項では、現在使用頻度が高いであろうmental rayを使ったグローバルイルミネーションを中心にして進めていきます。
フォトンマップ法
3D CGのレイトレーシング法では視点からレイ(光線)が空間上に照射され、オブジェクトにヒットした角度と光源の位置関係で拡散反射光のレベルを決定しますが(正確にはカメラからレイを飛ばす)、フォトンマップ法では光源からフォトン(光子)を飛ばし、物体にヒットした段階でそこに定着させ、再度その位置から拡散させるという手法をとります。
まだ拡散していない状態

少ないフォトンで拡散

多量のフォトンで拡散
窓から入ったフォトンが壁と床で反射し、部屋中に拡散します。実際の光は逆2乗で減衰していきますがフォトンも同様にこの係数で減衰していきます。上図の例では構造が理解しやすいようにフォトンの数をかなり低くくしたものと膨大なフォトンを発生させた状態を作っています。
ではフォトンの設定パラメータを理解しましょう。

「強度」と「近接フォトンを合成」、「ファイナルギャザーを最適化」はとりあえず置いておいて、非常に重要な残りの5つのパラメータを理解していきます。

ではフォトンの数がどのようにレンダリングイメージに影響するのかを見ていきましょう。
このシーンでは1つのダイレクトライトを窓の外に配置しています。

フォトンが100

1,000

10,000

100,000
フォトンの数が多ければ多いほどレンダリングイメージの品質は上がります。しかし半面レンダリング時間は増えていきます。また、上図の品質は100,000個のフォトンでも正直きれいな仕上がりとは言えません。そこで別のパラメータを設定します[グローバルイルミネーション]グループにある[サンプルの最大半径]を調節します。フォトンの数は10,000個でテストしましょう。

半径 5

10

100

1,000
[サンプルの最大半径]を調整していますが、正直言って10-1000の値では大きく差が出ていません。では全体のフォトンの数を500,000に増やして試してみます。

半径 5

10

100

1,000
全体に均一にフォトンが行き届いていますが、なんということか? 4つの例はほとんど同じイメージです。この現象の要因が重要なパラメータである[サンプル毎のフォトン最大数]です。
実はフォトンの半径と勘違いされている[サンプルの最大半径]とは、フォトンの粒の大きさではありません。フォトン自体はスケールを持たないものと考えた方が正しいのです。つまり、シーン内に色を採取するために任意の円形の領域を配置しその半径内に入り込んだフォトンの色をサンプリングする(採取する)という考え方です。結果的にはこの値がフォトンのサイズのように見えます。
以下の図がその考え方を示したものです。

サンプルの最大半径とは、フォトンを採取するための領域を示す値であって、その領域内に入り込んだフォトンを中心から順に設定数まで採取してその平均値を表示します。

ラジオシティでのメッシュ解像度が低いケース(左)と高いケース(右)
ラジオシティ法では、オブジェクトをサブディバイド分割し、各頂点の輝度値を元に計算を行います。ラジオシティ法ではメッシュの解像度を低くする(メッシュサイズを大きくする)と、計算結果は滑らかになり、計算速度も速くなりますが、ディテイルの表現ができなくなります。まったく同じ考えで、フォトンマップもそサンプルの最大半径が大きく、採取する数が多すぎるとディテイルの表現が難しくなります。
同じシーンをmental rayフォトンマップだけで表現します(FGは使用してません)。

サンプルの最大半径がシーンスケールの1/10のケース(左)と1/20のケース(右)。天井部分のディレイルの表現が圧倒的に右が勝ります。
ラジオシティとフォトンマップの考え方は非常に似ています。頂点で輝度をとらえるか、マップでとらえるかの違いでしかありません。フォトンマップの方がその輝度を確定するためのパラメータを調整可能なため、柔軟性に優れているといえます。
では、次にこの採取する数を変えて変化を見てみましょう。
[サンプルの最大半径]は10に、[ライト毎の平均GIフォトン]は500,000、この設定値は固定にし、[サンプル毎のフォトン最大数]に変化を与えます。

採取する数 10

100

1,000

5,000
全体のフォトンの数を減らして、半径と採取する数を固定にします。半径は10、フォトンの数は40,000個にします。

採取する数 100

1,000

2,000

6,000
どうでしょうか?採取する数が1,000から2,000に増えた場合は若干品質が上がっていますが、2,000と6,000では差が見受けられません。これは採取しようと思ってもシーン全体のフォトンの数が足りない為。差が出なくなってしまってます。この場合は[ライト毎の平均GIフォトン]の値を上げてることによって、品質をもっと上げることができます。
最後に、上図と同じ設定で、[ライト毎の平均GIフォトン]の数を1,200,000に一気に上げ、採取する数を2,000と6,000で比較してみましょう。

採取する数 2,000

採取する数 6,000
明らかに変化が発生しています。
このようにフォトンの設定はその原理を理解することによってそのパラメータの設定が楽になります。フォトンの数を増やして、また半径を大きく、さらには採取する数をただひたすらに大きくすればよいというものではありませんね。この設定値のバランスをうまくとると、メモリーに負荷をかけずに、短時間で最良のイメージを入手することができます。
実際に、皆さんが作成したモデルデータに対して、実際どの程度の値で設定したらいいのでしょうか? この値が正解! というものはありません。求めるクオリティや許容できる計算時間などによって大きく変わってきます。しかし何かしらの指標はほしいですよね。とりあえず以下の3つのポイントを目安にするとよいでしょう。
◆ [サンプルの最大半径] はシーン内にあるオブジェクトのスケールに対して1/10の値を目安に。
1辺15mの立方体型の建物の場合は最大半径は1m50cmになります。
◆ [サンプルの最大半径]を1/2にしたら[ライト毎の平均GIフォトン]の値を4倍にする。
設定時間を短縮したい場合
◆ [サンプルの最大半径]を1/2にする場合は、 [サンプル毎のフォトン最大数]を2倍にし、[ライト毎の平均GIフォトン]を8倍にする。
品質を重視する場合
フォトンを採取する際には、中心から採取を始めるために、全体のフォトンの数が増えていけば半径を減らしていっても、結果的には同じ結果となり、なおかつモデルのディテイルが損なわれないという事になります。要は、半径を小さくして全体のフォトンを増やし、採取する数も上げるという事です。
半径の設定はシーン内に配置するオブジェクトのサイズによってコントロールする必要があります。細い柱があるのに、柱の幅を大幅に超える半径を設定すれば、柱の詳細な情報は消えてしまいます。
多少のディテイルに甘さが出る場合がありますが、次に解説するファイナルギャザーで修正が可能です。つまり ある程度の光のまわりこみはフォトンマップで終わらせておき、ファイナルギャザーの設定値を軽くして全体の計算時間を短縮させるということです。しかし、ファイナルギャザーを併用するにしても、過剰なノイズが目立つフォトンマップ処理だと、ギャザリング処理の段階で、そのノイズを強調させてしまう事があり、逆効果となります。ノイズ成分はフォトン設定の段階で除去することが重要です。ディテイルを求めるより全体の滑らかさにウエイトを置いた方がよい結果を生む場合もあります。
フォトンマップは、完全に空間上に配置されます。ちょうどラジオシティ計算と同じ考えです。一度計算した結果はファイル化して保存させることが可能です。フォトンの数を大量に設定すると計算時間に時間がかかりますが、一度計算してしまえばシーン内で視点を移動しても再計算の必要はないため、マルチアングルで複数のイメージを作成する場合は威力を発揮します。

また、照明分析機能などを使用する場合はフォトンの計算結果をベースに輝度値、照度値を数値化するために、かならずフォトンマップを使ったグローバルイルミネーション計算が必要になります。
フォトンマップにはさらに、コースティックスと呼ばれる処理があります。これはフォトンサンプルの採取半径がシーンサイズの1/10であるのに対してコースティックスは1/100を目安にするとよいでしょう。今回は、コースティックスに関する解説は省略しますが、フォトンの設定方法を理解すれば、扱いは楽なはずです。
では次回はいよいよファイナルギャザーについて述べていきましょう。