読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】ライトマップを頂点カラーに焼く

今回はライトマップを作成するのではなく、ライトの輝度を頂点カラーにベイクして使用するアプローチについて紹介します。

下の画像は綺麗に影が表現できていると思いますが、実際はAlbedo用のテクスチャしか利用していません。モデルのAOや地面に映り込む影は、全て頂点カラーで表現しています。

f:id:tsubaki_t1:20150814221204p:plain

 

流石に近づくと一発でわかるようなクォリティですが、対象が離れたマップ情報やモバイルのような小さい画面の場合は、上手く機能するかもしれません。

頂点カラーでライトマップを代用するメリットは
テクスチャが必要ないこと。デメリットは…

このアプローチのメリットは単純明快にライトマップに使用するテクスチャが必要ないことです。
テクスチャを使用しないので、GPUへテクスチャをアップロードする際のスパイクなどが回避できるほか、巨大なライトマップテクスチャが必要ないのでロード時間やメモリサイズに関してもメリットがありそうです。

f:id:tsubaki_t1:20150815002145p:plain

 

デメリットは表現力の低下です。頂点カラーに色を仕込むとはつまり、頂点の無い処には色を設定できないという事です。
ポリゴン数が多いなら兎も角、頂点数の低いモデルでは低解像度のテクスチャと比較しても低下します。
下の画像では、頂点数の少ない地面に対して頂点カラーの影を設定しています。モンスターのモデルはそれなりに綺麗ですが、地面は荒さが目立ちます。
これは特に、影がパッキリ分かれている場合は顕著に出てしまうので、影がパッキリしている処には使わないか、影の部分はポリゴンの量を上げる必要がありそうです。

f:id:tsubaki_t1:20150814222606p:plain

また調整の手間が大きく、非常に面倒です。

ライトマップから頂点カラーを焼く手順

ライトマップから頂点カラーを焼く方法は、こちらの記事で紹介されています。
Beast Lightmaps to Vertex Colors in Unity (with texture blend support) | adrianswall

 

が、ここでは自分なりのやり方を書いておきます。
まずは必要なファイルを入手します。今回必要なファイルは、LightmapToVertexRGBA_RG2UV2.csAE/AE Vertex GI (RGBA) with UV2 blendingです。この二つのファイルをインポートします。

f:id:tsubaki_t1:20150815001707p:plain

 

次にライトマップを焼くべきステージを用意します。これは、ポリゴン数が多ければ多いほど綺麗に出ます。が、多ければ多いほど負荷も上昇するので、ケースバイケースです。

f:id:tsubaki_t1:20150815001848p:plain

 

このアプローチはオブジェクトのMeshを書き換えるので、元のMeshのクローンに該当するオブジェクトを用意します。
今回は Unityのシーン上に配置したモデルを結合する  で紹介したメッシュの結合を利用してモデルを複製しています。メッシュの結合も出来て一石二鳥です。

f:id:tsubaki_t1:20150815002518p:plain

 

ライトマップを焼きます。この時、ライトの設定はBakeに設定します。マテリアルのEmissionで光っているオブジェクトに関してもBakeに設定します。
ライトは必ずBakeで焼きます。AutoだとLightmapテクスチャを出力してくれません。

Unity5でライトを焼く - テラシュールブログ

f:id:tsubaki_t1:20150815002803p:plain

 

各頂点の色を取得し頂点カラーに適応するために、ライトマップから色を取得できるようにします。
Lightmapのテクスチャを確認し、TextureTypeをAdvancedへ変更、ReadWriteにチェックを入れます。

f:id:tsubaki_t1:20150815003325p:plain

 

ライトマップの情報を頂点カラーに流し込みます。
該当のオブジェクトを選択した状態で、メニューバー >  GameObject > Lightmap to Vertex RGBA, RG to UV2 を選択します。モデルが暗くなれば概ね成功です。
失敗したら、モデルのクローンからやり直してください。この挙動はLightmapToVertexRGBA_RG2UV2.csに書かれています。

f:id:tsubaki_t1:20150815003901p:plain

 

Unityの標準シェーダーは頂点カラー(Vertex Color)には対応していないので、対応するシェーダーを使用したマテリアルに差し替えます。
AE/AE Vertex GI (RGBA) with UV2 blendingを使用したマテリアルを用意し、モデルに適応します。
AlbedoはDefuse 2が該当します。単色だと一発でバレるような解像度でも、地面に模様を塗る事でかなり気づきにくくなります。

f:id:tsubaki_t1:20150815004613p:plain

 

これでライトマップに使用していたライトマップのメモリが浮き、そのロード時間が削減されました。

流石にキャラクターや重要なオブジェクトに頂点カラーで色を設定するのは表現力が乏しすぎるので難しいと思いますが、重要ではない背景ならば、まだ使えるかなって気もします。

 

Scale In Lightmapの低い、低解像度なライトマップと比較してどっちが安いかは…うーん。どっちなんでしょう。

 

ライト以外の頂点カラー描画

なお、頂点カラーでモデルの色を塗るアプローチを行うアセットは幾つかあります。
個人的にはpolyWorldがお気に入りですが、これはかなりテイストがpolyWorld臭くなるので、絵の雰囲気を一致させるには便利ですが、一致させたくない場合は注意が必要です。