7 月 25 2008

Lightwaveでシェーディング済みテクスチャを作成する

Posted by tanjo at 4:16 PM

Lightwave 3D Layout でライティングし、そのシェーディング結果をテクスチャとして利用できるようにしてみます。
今回私は、レースゲームのシェーディング済みテクスチャを用意するためにこの方法を使います。ですので、精度よりも生産性を重視しています。キーワードは2つ。

  • Ambient Occlusion(アンビエントオクルージョン)
  • Surface Baking Camera(サーフェイスベイキングカメラ)

アンビエントオクルージョンで環境光を模倣

レースゲームのフィールドだから、「影」はくっきりとしたレイトレースのシャドウでも良いのだけれど、環境光を感じるようにするには、やっぱりやわらかい「陰」も必要でしょう。
環境光を再現する方法としてはラジオシティが正確ですが、とっても重い、と。そこでアンビエントオクルージョンを使います。ラジオシティは反射していく光を次々と追ってシミュレートするのに対し、アンビエントオクルージョンは周囲から光がどのくらい遮られるか、という陰係数をもとに計算するそうです。

ちなみに速度重視なら、Lightwaveでは、シャドウマップを使った疑似環境光が圧倒的に速いです。ですがフィールドモデルのスケール・場所に影響を受けやすく、今回は使いません。やり方は、以下のページ12灯スポットライトの項で分かりやすく解説されています。

レイトレーシングで環境光を模倣する具体例 ~ Lightwave 3D

まずはモデリングをして、UVマップを作成しておきます。

Lightwave v9ではサーフェイスはノード形式で制御できるようになっていて、アンビエントオクルージョンもノードを介して「サーフェイスに」設定してやります。レンダリングはレイトレースを使います。

標準でインストールされるアンビエントオクルージョン・ノードには Occlusion, Occlusion II の2つがありますが、どちらも精度がイマイチ。より細かく設定できるノードプラグイン SG_AmbOccNode を使いました。

サーフェイスのノード設定はこのようにしました。

モデルの大きさがどうなっても困らないよう、ライトはすべて Distant Light を使用します。場合によってはライトのプロパティで Ambient Intensity を高めに設定しちゃっていいかもしれません。
Render Globals のオプションで Ray Trace Shadows にチェックを入れ、レンダリングすると、環境光が再現されていることが分かります。

サーフェイスベイキングカメラでテクスチャ書き出し

ここからが本題ですね。レンダリングした状態のサーフェイスを、テクスチャとして保存します。
Lightwave v9 Layout では Surface Baking Camera というカメラが追加されていて、これは、メッシュとUVマップを指定すると、それに応じたUVテクスチャをレンダリングしてくれるというものです。書き出した画像をテクスチャとして設定すれば、簡単にシェーディング済みモデルの完成です。

やり方はとても簡単。
まずはModelerで、適用させたいポリゴンだけを選択してUVマップを作成し、それらのポリゴンを1つのレイヤーにまとめておきます。
Layoutに移ったら、カメラのプロパティから Surface Baking Camera を選択し、設定で Mesh に先ほどのオブジェクト、UV Map にさっきのUVを指定します。その他の項目を適当に設定し(出力画像のタテヨコ比に注意)、レンダリングすればUVマップ用の画像が取得できるはずです。

低解像度の場合は、UV Border の値を設定して、UVマップの輪郭よりレンダー画像が少しはみ出すようにしてやった方がいいかもしれませんね。詳しいチュートリアルは、公式のデモビデオで取り上げられています。

古いバージョンのLightwaveを使っている場合

アンビエントオクルージョンは、SG_AmbOcc プラグインが利用できます。
ベイキングは Surface Baker (LW_Baker) シェーダが利用できます。チュートリアルはこちら
でも、どちらも使ったことなくて詳しいことは分かりませんッ。

ゲームで使ってみました

さて、レンダリング済みモデルをCOLLADAに変換し、前回作ったゲームサンプルに読み込ませてみました。
まあ相当荒削りなサンプルですが、少しは空間内の建物として見えてきたでしょうか。

レースゲーム・サンプル画面

デモをプレイする (要:Flash Player 9.0.115.0以降)

Leave a Reply