先人の記述などを参考に、自分もLightmapなるモノに挑戦してみることにする。ライトマップやシャドウマップと呼ばれる技法は、3Dゲームではよく使われる技法。その名の通り、モデルの明暗や陰影の表現をテクスチャマップで行う。で、何の利点があるのかというと、テクスチャメモリを押さえつつリアルな表現が可能であること。ベイクドマップでも似たような表現が可能だが、こちらは一枚のテクスチャに陰影を書き込むので、ユニークなものになりテクスチャの使い回しが効かない。しかし、ライトマップ技法は外観のテクスチャの他に陰影のみのテクスチャ(LightMap)を用意する。よって外観のテクスチャは使い回せるし、陰影のテクスチャは低解像度で充分である。
今回アイザワが行った手順
1. 通常のマッピングを行ったW3Dモデルを作成。これと別に、ライトマップを貼り付けたW3Dモデルを用意する。ライトマップ自体は、3Dソフトのテクスチャレンダリング機能を用いた。Director内で合成する。
shadowModel = pMem.cloneModelFromCastMember("LightMap_"& pModel.name , pModel.name, xShadowMem)
2. ライトマップを適用したいモデルとライトマップを持ったモデルにメッシュデフォームモディファイアを適用。ライトマップ用のUVコードを入力するレイヤーを追加。
pModel.addModifier(#meshdeform)
shadowModel.addModifier(#meshdeform)
pModel.meshdeform.mesh[1].texturelayer.add()
3. UVコードを比較して、コピーする。ここが肝で、同じ頂点数の同じハズのモデルでも3Dソフトから書き出し際に頂点の順番がバラバラになるため、単純にUVコードをコピーできないが、イメージ的にはこう。
pModel.meshdeform.mesh[1].texturelayer[2].textureCoordinateList =
shadowModel.meshdeform.mesh[1].texturelayer[1].textureCoordinateList
4. 後は、シェーダーにテクスチャを追加するだけ。
まとめ
意外と簡単に出来た。次回は加算LightMapも表現してみたい。Lingoは問題ないが、3Dソフトとの連携をどこまで簡単に出来るかが、SOLAに導入する際のポイントだ。
関連記事
ライトマップ -- 2004年09月27日