2016年8月4日木曜日

【UE4】ライトマップの適正パディングを確保する

先日行われたUE4DeepDiveではLightmassについての勉強会が行われ、その内容の濃さに非常に感動しました。

勉強会で使用されたスライド等はこちらにアップされておりますので、ご確認ください。

○UE4 Lightmass Deep Dive ポストモーテム


Lightmassでライティングを行う以上ちゃんと作成しなければならないのがライトマップですが、
なかなかに面倒な作業だったりします。

ライトマップを作成するにあたりいくつか押さえておかなければならないポイントがあり、
これらを守っていないときれいな結果が得られにくくなります。


  • ライトマップUVはオーバーラップしないようにする。
  • UVシェルはできる限りつなげる(必ずしもよいとは限らない場合もある)
  • エッジのラインはピクセル(グリッド)の方向と合わせる。
  • UVシェルのパディング(間隔)は最低4ピクセル確保する。。。。

とこれだけではなくもっと細々とあったりします。




ライトマップについての解説は公式を読んでいただくのがよいのですが、
hisamuさんがblogにわかりやすくまとめてくださっています。

また、海外だとUDK(UE4の前のバージョン)でのライトマップの展開方法について数多くのサイトがあります。
基本的な考え方はUE4も同じなので参考にしてみてください。
(UDK, Lightmapで検索すると色々出てきます)

UDK: Lightmap UV Layout Techniques & How to Create a Second UV Channel in Maya

Tutorials – UE3 Lightmapping

今回私がやるのは、4つ目にあるパディングを4ピクセル確保するための方法についてです。




■ライトマップの1ピクセルがわかるようにする

※8/4改編
  もっとわかりやすくていい方法があったので書き直しました。
  以前の方法だと端数のグリッドができてしまいましたが、この方法だとぴったりと1グリッド1ピクセルになります。

ライトマップUVをレイアウトするにあたり、必要なパディング(間隔)の値は公式サイトに記載があります。以下引用。

ライトマスが、にじみのアーティファクトを防ぐのに十分なパディングを自動的にエッジ周囲に行うからです。UV チャート間にパディングをセットアップする場合、DXT 圧縮が 4x4 テクセルのブロックで動作するため、すべてのにじみを防ぐために通常 4 テクセルが必要になることに注意してください。 


ライトマップを展開してて思うのは4ピクセルの隙間ってどんくらい?
ということで、1ピクセルがわかるようにグリッドの表示を変更して確認できるようにしてみます。
ここの設定はあくまでも確認用なので、毎回やる必要はありません。

UVエディタのビュー>グリッド□からグリッドのオプションを開きます。




まず、グリッドラインの間隔を1にします。
次にサブディビジョンに使用する解像度を記入します。
サブディビジョンを表示させるために、サブディビジョンラインにチェックを入れます。


今回作成するライトマップはUE4のデフォルトで設定されている64ピクセルを想定して、
サブディビジョンに64と入れてみます。


入力したら適用を押します。
するとグリッドがこのような感じになります。



細かくてわからねぇw 
って感じですが、縦横に64個グリッドが作成されているので、1グリッドが1ピクセルとなります。

わかりやすく確認するなら16ピクセルの場合を想定して値を入力してみましょう。

これでパディングが何ピクセルか確認しやすくなりました。



■レイアウト機能で自動的に適正パディングを確保する

※8/4改編
  パーセンテージ空間の数値の考え方について指摘を頂いたので、それを踏まえた内容に修正しました。



次にパディングを確保しつつ、オーバーラップしないようにレイアウトする方法です。

MayaのUVエディタにはレイアウトという機能があり、隙間を何パーセント確保するかを決めることができます。
UVエディタのポリゴン>レイアウト□からオプションを開きます。

赤枠にあるシェルの間隔のところでパディングは指定することができます。
それ以外にもUVシェルのスケールを統一してくれたり、重ならないようにレイアウトしてくれたりするので、非常に便利です。

レイアウト、レイアウト設定のところは私は普段使用している設定なので参考までにどうぞ。


Maya側で間隔のプリセットが用意されていますが、どういう基準なのかはいまいち不明…。

入力はUVの0-1の空間に対するパーセンテージになるので、UE4でデフォルトで指定されている64ピクセルのライトマップを想定して計算してみます。


計算式はこんな感じに算出しました。xが求めたいパーセンテージの値です。

64pixel : 4pixel = 100% : x%

計算するとx=6.25と出ます。


しかし、ここで問題が発生。
このレイアウトのオプションで入力できるパーセンテージの値は5%が上限のようです。
さらに問題があり、計算で出したパーセンテージの値だと間隔が開きすぎてしまいました。

とりあえず、5%を入れてみたものの…

試しに3.125を入力してみると、ちょうど4ピクセル確保できてるように見えます。
これはどういうことなんでしょうか??


と思いましたが、もんしょさんから神の声

たしかに!なるほど!もんしょさんありがとうございます!


このことを踏まえて解像度事にパーセンテージをリスト化すると以下のようになります。
  • 32   6.25%(入力できない!! ><)
  • 64   3.125%
  • 128  1.5625%
  • 256  0.7812%

Maya様は5%以上は受け付けて下さらないので、32ピクセルの時はちょっと困りますね…。

では、改めてこの数値を入力して、レイアウトしてみます。
すると約4ピクセルのパディングが確保できたことが確認できます。



ライトマップの解像度なんて、アセットによって異なるので毎回パーセントを入力しなおすなんてめんどくさい… って感じなので、
この一連の操作を楽にするようなmelがあればいいな~なんて思ったり…。


■もっとわかりやすいやつ…


しかし、このパーセンテージってわかりにくいですよね。
もしMaya2016Extention2以降のバージョンをお使いであれば、レイアウトのオプションにUnfold3Dの方式が追加されており、もっとわかりやすく感覚的に使うことが可能です。


方法はUnfold3Dに変更します。

パッキング反復は回数が多いと何回も配置の計算をするので1回にしていますが、シェルの数がすごく多い場合などは20とかデフォルトの値を入れてもよいかもしれません。
ここについては未検証。

レイアウト設定
テクスチャマップサイズにライトマップ解像度を入力
シェルのパディング:シェルの間隔を指定
タイルのパディング:UVの端からのパディングを指定


タイルのパディングについては公式の記述によると、

ライトマップの UV レイアウトのエッジ周囲のパディングは不要です。

とあるので0を入力してよさそうです。(ちょっと不安ですけども…)
上記設定で適用をクリックすると以下のようなレイアウトになります。



シェルのパディングは4ピクセル確保されており、
タイルからはぴっちりくっついた状態になります。

私はまだEx2をメインで使用できていないのですが、
Unfold3Dのレイアウト機能はとても強力なので、使える方は使ってみるとよいかと思います。




■さいごに・・・


次にUE4で何か作るときにちゃんとライトマップの展開ができるようにと残したメモ程度のものなので、これで運用してたら何か問題が出てくるかもしれませんし、
こういう場合どうすんだ?みたいなのもあるかもしれません。

ライトマップで苦しむかたの参考になればよいなと思いますので、
何か誤ったことやこうしたらもっといいよとかあれば教えてください!!


0 コメント:

コメントを投稿