技術

BlenderでBakeしたテクスチャを自作プログラムで表示してみる

例によってコマ落ちしてるのは録画マシンの性能が悪いからであります。
録画してない状態だとヌルヌル動きます。
ていうかQuick Time Playerの画面収録って重すぎだよねえ。

3Dゲームの背景モデルのテクスチャは、ラジオシティやフォトンマッピングなどの手法でオフラインレンダリングしたGI情報ををテクスチャに焼き込む(Bake, ベイク)することによって、ゲーム実行時の負荷を大幅に軽減しながら高品質な見た目を実現する、なんて方法が用いられることがほとんどかと思います。
(何を焼き込むかについてはオーソドックスなライトマップや球面調和関数の係数をテクスチャ化したものなど様々です。次世代ゲーム機ではこのあたり必要なくなって制作が楽になる場合が増えるといいですね。)

個人製作の3Dゲームの場合、このテクスチャをオフラインでベイクしてるかどうかが、見た目の質に大きく差をつける要因の一つになるかと思います。
(さすがに企業レベルになると当たり前にやってるので差別化要因にはならないですけど。)

ということで、Blenderで適当に部屋をモデリングして、間接照明を有効にしてテクスチャにベイクしたものを、自作のプログラムで表示してみて、どんな手順でやるか、どのくらいの見た目になるかを確認してみた結果が上の動画になります。
ベイクしたテクスチャは、光の強さだけを保持するライトマップではなくて色そのものを保持してます。
なので、プログラム側ではまったくライティング無しでテクスチャを張ったそのままを表示しています。

猿の下側が、土台の色に影響を受けてうっすら緑になってるのが確認できますね。

テクスチャは部屋全体で1つにまとめ、サイズは1024*1024となってます。
録画した段階とYouTubeにアップした段階の2回のエンコードによって画質が悪くなってますが、実際はもっとくっきりはっきりしてます。
もう少し複雑な部屋でもこのサイズでなんとか行けるんじゃないかと思います。
さらにもっと複雑なシーンの場合は性能と相談しながらテクスチャの枚数やサイズを増やしたりって事になるでしょう。

シーンは6個のオブジェクト(部屋そのもの、猿、猿の土台、照明x3)から構成されており、最初「Blenderでどうやってこれを1つのライトマップにするんだ!?」なんて途方に暮れましたが、オブジェクトモードで複数選択した後、編集モードにして「メッシュ」→「UV展開」→「ライトマップパック」で「選択したメッシュオブジェクト」を選択すると自動的に一つのテクスチャに展開してくれました。

今回モデルの読み込みはBlender→Collada→Assimp(C++のライブラリ)という流れで行ってみました。
Assimpは色んなフォーマットに対応してて素晴らしいんですが、C++のライブラリなのにやけにCくさい(全体的に構造体の使い方がCっぽい)ところがアレです。まぁいいんですけど。

しかしまぁ多分一番難しいのはこの状態にいかに違和感なく動的なオブジェクトを溶けこませるかでしょうね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください