UnityでリアルタイムIBLしてみた

(※こちらは過去の記事を移転したものです)

Unityでリアルタイムにイメージベースドライティング(割と疑似ですが。)してみたのでそのときのメモです。

Unityのゲーム画面キャプチャはYoutubeとニコ動の方にアップしてあるのでぜひ見てください。

どんな感じでやったか

とりあえず全部リアルタイムでやるのは無理なので、アンビエントは全部テクスチャベイク&ライトマップして静的な物として扱います。
リアルタイムでやったのは今回はディフューズとスペキュラとシャドウにしぼってやりました。

すごく分かりやすい記事がたくさんあったので、参考にした記事とハマったところとかのメモをのせます。

環境とかは以下の物を使っています。

  • Unity 4.5.4f1 (free版)
  • Blender 2.7.2a

初音ミクを踊らせてみよう

これはMMDforMecanimを使いました。
http://stereoarts.jp/

こちらのドキュメントは非常に分かりやすいので、そのままチュートリアルを実行すれば、特にハマることなくUnityで初音ミクを動かす事は出来ると思います。

自分が今回使ったモデルとモーションは以下の物です。ありがとうございます。

モデル:Tda式Appendミク / Tdaさん

https://bowlroll.net/file/4576

音源:WAVEFILE/初音ミク fullver. / 名無しさん

http://www.nicovideo.jp/watch/sm14257396

モーション:WAVEFILE fullver.モーション / hinoさん

http://bowlroll.net/up/dl5983

ちなみに、いろいろモデルを使ってみてTda式ミクに着地しました。

理由はトゥーンシェードを外した時に一番しっくりくる事、装備品とかがスペキュラとかをつけた時に映える事、他のモデルだとシェーディングした時のフェイスパーツのつなぎ目がアーティファクトとして目立つ事などです。

頂点数なんかも少なすぎず、いい感じでした。

Unityのライトマップでクオリティをあげよう

miku_lightmap

Unityのfree版でも時間をかけてライトマップを作れば上図のようなかなりきれいな絵が出せます。

ただ、ライトマップを焼く場合はstaticなオブジェクトである事が前提なので、対象物はステージとかterrainみたいな固定されたものである必要があります。

もちろん、初音ミクみたいなごりごりに動くオブジェクトをリアルタイムレンダリングしたい場合はシャドウとか陰影が常に動くので特定のシーンに依存するようなライトマップを焼いてしまうと動かした時になんか変な感じになってしまう訳です。

今回は動かないステージ部分のライティングと、ミクのシャドウ意外のアンビエントはライトマップやらプリレンダリングやらで先にテクスチャに焼き付ける方法を取ります。

ライトマップに関してはこちらの記事が非常に参考になるので一読して見てください。
一気にクオリティの高い絵が出せるようになると思います。

http://tsubakit1.hateblo.jp/entry/2014/09/14/170753

ハマりポイントとしてはライトマップの解像度を適切に設定しないとかなり荒っぽくなるので気をつけてください。

で、試しに初音ミクをライトマップでレンダリングしてみます。

miku_lightmap

なんかすっごい微妙な感じになってます。

どんなにがんばってもこんな感じになってしまいます。
これは表示されていないポリゴンが遮蔽されてたり、本来離れたオブジェクトの陰が乗っちゃってたりしてこんな感じになってるんじゃないかなーと推測してます。

ポリゴン同士を離したり、パーツを分解してライトマップを作り直せればたぶん改善するんでしょうけど、MMDforMecanimで読み込んだ時点でUnity上ではパーツが分解できないみたいなので、Unity上での処理はあきらめました。

Blenderでアンビエントオクルージョンをテクスチャに焼こう

直接光やシーンに依存しない、間接光による陰影をアンビエントオクルージョンと言ったりするんですが、まじめにやると計算時間がすごくかかるので今回は先に述べたように、あらかじめ計算してテクスチャに焼いておく方法をとります。

Unity proではSSAOなどのリアルタイムアンビエントオクルージョン手法がデフォで入っているのですが、free版ではポストエフェクト処理全般が使えないので、自力で実装するか、テクスチャに焼いちゃうかしかないと思います。

Unity freeでSSAO実装できるんですかね?

で、オクルージョンを焼くんですが、当初はライトマップがいい感じなのでUnity上で焼いてしまおうと思ったんですが、さっきの図みたいにUnity上のミクだとアーティファクト乗りまくりなので、あきらめてBlenderでレンダリングする事にしました。

最近のBlenderにはCyclesというレンダラーが付いていて、かなり本格的なレンダリングができちゃいます。

しかもリアルタイムでプレビューが出来るので、調整もすごい楽。

Cyclesの使い方は以下のページを参考にしました。

http://www.kitotan.com/944
http://seiga.nicovideo.jp/seiga/im2951328

解説通りに行くと以下のような絵が出せると思います。

cycles

ポイントとしては、アンビエントオクルージョンを描きたいので、光源は消す事。
光源を消してもCyclesは環境光をいい感じに醸し出してくれます。
その分暗いので、環境光は強めに設定してください。

環境光の強度はこんな感じで設定します。

http://silverspirecg.blog119.fc2.com/blog-entry-36.html

このレンダリング結果をミクのテクスチャにベイクします。

【レンダータブ>ベイク】

でベイクできます。
パーツごとに選択してベイクしてください。
ここで、クリアチェックボックは外しておかないとテクスチャに上書きされていかないので、気をつけてください。

ベイクしたテクスチャは口の中とか遮蔽で真っ暗になっているので適宜手書きで最終調整して出来上がりです。

出来上がったテクスチャはGitHubに上げたので、参考にしてください。

UnityでIBLをしよう

クオリティの高いアルベド+アンビエントテクスチャが焼けたので、いよいよイメージベースドレンダリングをしていきます。

UnityのIBLはSkyshopというマテリアル群が有名で、AssetStoreから購入する事ができます。
しかし、結構高いので、今回は無料で手に入るマテリアルでがんばる事にします。

Luxというマテリアルシェーダを使用しました。
使用方法はこちらの記事を参考にしました。
githubのmasterブランチzipを使用しています。

http://qiita.com/yasei_no_otoko/items/18bd1e4ed9abc6da8357

基本は上記の記事通りにセッティングすれば動きます。
ただ、デフォルトではディフューズ環境マップとスペキュラ環境マップが1種類しかなく、バックグラウンドの画像解像度も低いので、自作します。

画像のソースはこちらから頂きました。

http://www.hdrlabs.com/sibl/archive.html

このサイトからHDR画像を落としてくると、ディフューズ画像も付いてくるのですが、試してみるとちょっとぼかしが足りなくて、ディフューズ感が足りないので手動でもっとぼかします。

カウスブラー40pxくらいぼかすとちょうどいい感じがしました。めっちゃ適当ですね。。

で、ハマったのが、HDR画像だと環境マップ化する時に緑色になっちゃって変な色合いになります。
たぶん設定をちゃんとやれば取り込めると思うんですが、思考停止してjpgに変換してUnityで環境マップを作りました。

TextureTypeはRefrection、MappingはCylindricalでマップを作成します。

最終的な環境マップはgithubに上げておきました。

リアルタイムソフトシャドウを出そう

Unity free版のシャドウはほんとひどいです。

ハードシャドウしか出せない上に、初期設定のシャドウマップ解像度が低すぎてめっちゃジャギってます。

これもproならちゃんとソフトシャドウをリアルタイムに出してくれるのに、ほんとずるい。

てなわけで、ソフトシャドウはがんばって実装します。
参考文献はこちら

http://unitycoder.com/blog/2014/07/15/unity-indie-soft-shadows-directional-light/

コードはGitHubに上がってます。

簡単に言うと、Percentage Closer Filteringの簡易版見たいな感じで、AutoLightを改造して四方にサンプリングしたものになります。
デフォルトのクラスを改造しているのでフォルダを丸ごとぶっ込んで使ってください。

また、このシェーダはUnityでベイクしたライトマップの結果と互換性を持たせてあります。
なので、今回の初音ミク動画のシーンの静的オブジェクトに関しては、ライトマップをかけたあと、ミクのソフトシャドウが乗っているって感じです。

miku_res3

ゆーてカーペットしかレンダリングされてないんですけどね笑
ソフトシャドウがちゃんと出ている事を確認できると思います。

結果と課題

miku_res2

動画の方が分かりやすいかと思いますが、シーンによってミクの陰影がほんのり色づいているのが分かるかと思います。

目とか髪の毛のスペキュラも環境の映り込みがばっちり移ってます。

これがIBLの効果であり、60FPSで動きます。

そんな重い処理していないので当たり前ですが。。

カメラの動きとか光源の動きにも対応できるので、色々応用は出来るのではないかと思います。任意の写真で対応できるので、ARとか面白いかも。

今回は手抜きでSSSとか実装していないので、手が空いたらやってみます。
被写界深度とかモーションブラーとか、ポストエフェクト系もやりたい。

今回のアセット

使用したアセットは以下から入手可能です。
適当にZIPダウンロードしてください。

また、利用する場合は各種READMEをご覧ください。
よろしくお願いします。

GitHub - UnityIBLAssets