2013年4月4日木曜日

LightWaveでテクスチャを焼き込んでUnityへもってくメモ

UnityProにはBeastLightmappingでグローバルイルミネーションの焼き込み(Baking)ができますが、Free版にはありません。LightWaveでグローバルイルミネーションのテクスチャを焼き込む作業を何回もやってるのでメモしておきます。

おそらくBeastを使ったほうが数倍楽で、しかも速いと思われます。Beastでの焼き込みでもパラメーター調整しないとノイズが乗ることがあるようですが、それはLightWaveでも同じです。Pro版を使ってる方はBeastを使いましょう。Free版で尚且つLightWaveを持ってる場合にしか以下は参考になりません。

まず適当に部屋(ただのflipした箱)の中でボールが発光してるシーンを組み立てます。光源はボールだけです。焼き込むのは部屋だけにするので、箱のUVマップをAtlas展開で作っておきます。



Layoutに持っていき、マテリアルの設定とGlobalIlluminationの設定を行います。この時点でVPRでレンダリング結果が見れればOKです。Render GlobalsのCamerasでターゲットをSurface Baking Cameraにします。PropertiesでModelとUVを箱に設定してレンダリングすれば焼き込み結果がレンダリングされます。その際、レンダリングするサイズは1024x1024のような、正方形にしておきましょう。



単純なモデルなのでGlobalIlluminationはInterpolated(グラディエント補間)でサンプル数を増やして焼き込みました(後述しますが、複雑なモデルだとInterpolatedだとなぜか現実的な時間で終わらない場合があります)。Indirect Bouncesは2~3程度にしてます。シーンをFBXでUnityにもっていき、スケールをあわせたら箱のマテリアルをUnlit/Textureにし、先程焼き込んだテクスチャを設定すれば完了です。





WebPlayer版をここに置いておきました。


Q:部屋の角にInterpolated特有のノイズが出る

サンプル数を上げるなど、パラメータ調整で緩和できます。あるいはInterpolatedをOFFにしましょう。


Q: Unityで再生するとマッハバンドのような境目が見える

たぶんしょうがないです。プレインなマテリアルは難しいです。何かしらテクスチャ(コンクリート、壁紙、等)を張ると目立たなくなります。あるいは10bit深度が当たり前になるのを待ちましょう。


Q: メッシュが複雑だとInterpolatedでウルトラ時間がかかる

これの原因は分かりません。InterpolatedをOFFにしましょう。どちらにしろノイズを収束させるまで時間がかかりますが、Interpolatedほどではありません。この場合キレイなテクスチャが焼きあがるまで一晩かかることは普通にありえます。Maximum samples(旧Adaptive Antialiasingだったかな)を64とかにしてノイズが収束するまでがんばりましょう。Adaptive SamplingのThreshold(収束条件の閾値のようなもの)も調整したほうがいい場合もあります。

追記: LightWaveの11.6で改善されてるかもしれません。FeatureにTexture Bakingがよくなったとの記述があります。

いずれにしろ、InterpolatedのON/OFFでは結果が少し異なります。interpolatedでは焼き込むサーフェス(可視面)に対してグローバルイルミネーションのマップを作成しますが、これだと見えない面、特に多重反射して外側からやってくる光線の影響が省かれる場合があるようです。難しい局面ではInterpolatedは避けたほうがいいかもしれません。

Q: メッシュを分割すると継ぎ目に黒い線が出る

UVの対応するメッシュの外側の色(完全透明→プレーヤー上では黒)が出てしまっています。Surface BakingのPropertiesのUV Borderの値を増やすことで多少緩和されるかもしれません。この値の単位はPixelだそうなのでレンダリングする解像度によっても調整が必要です。テクスチャの解像度を上げるのも有効です。(AnisoLevelの調整も有効かもしれません。未確認。)

あとはPhotoshop等でEXRを透明度で読み込んで、複製→下のレイヤーを少しぼかす→それを複製→下の2つを統合→下のレイヤーを複製→下の2つを統合・・・ を数回繰り返せばメッシュ上の色を維持したまま、メッシュ外への参照を黒以外(近隣のメッシュの色)にできます。とてもアナログな方法なのであまりお勧めできません。良い方法あったら教えてください。

Q: Unity内のライティングや他のテクスチャと併用したい

ShaderをSelf-Illumin/Diffuseや、Legacy Shaders/Lightmapped/VertexLitなどにすればできます。細かい調整をしたい場合はShaderを書かないと無理かもしれません。

Legacy Shaders/Lightmapped/VertexLitで焼き込みテクスチャ+他のテクスチャ
Lightmapの輝度*RGBと思われる
ここ






めんどくさいですが、がんばればそこそこいけますね (でもPro版が欲しい・・・)