見出し画像

バーチャルマーケットのブースを作る (3):ライトマップ後編

はい、美坂です。
この記事ではBlenderで「バーチャルマーケット向けの」
ブースのライトマップ設定の手順を解説します

ターゲット層は前回と変わりません。

・バーチャルマーケットに出展したことがあって
 クオリティを更に上げたい人

・BlenderとUnityのライトマップについて
 ふんわり知りたい人

あたりを想定して説明していきます
例によってBlenderとUnityの基本操作はできる前提です

あと同じ内容の動画も同時公開しています。
テキストと動画、好きな方見てくださいね。

[はじめに]

今回はライトマップの話の続き。
ここからいよいよ具体的な手順の解説です。
Blenderでライトマップを焼く手順と、Unityで焼く手順、
両方やっていきます。

実践的ではありますが狭いジャンルの話なので
視聴者をどんどんふるいにかけていくやつです。
皆さんついてきて……

画像1

全体の流れとしては
Blenderで焼く場合は、
普通にモデルを作ったあとライトマップ用のUVを追加・設定
そしてライトマップをテクスチャに焼いて
最後にモデルとライトマップをUnityに持っていって使う
みたいな感じ。

Unityで焼く場合は
モデルのUV設定終わった時点でUnityに持っていって
Unity側でライトマップを焼く
みたいな感じになります。

[BlenderでのUV設定]

Blenderでライトマップを焼く工程、いってみましょう。

ブースのモデリングが終わって
テクスチャのUV設定が終わって
ライトもそれっぽく配置された、という状態を想定して進みます。

いろいろ飛ばし過ぎな気もしますが
この記事は「ライトマップ」の説明です
モデリングは対象外!

画像2

まずUVをふやします。
 ブースのオブジェクトを選択してデータプロパティのUVマップを確認。
既に1つ割り当てられているはず。 UVマップを追加します。
 判りやすく名前変えておくといいです。Lightmapとか。

Unityでは1つ目のUVを通常のテクスチャ、
2つ目のUVをライトマップに使用する仕様です。
順番を間違えないようにしましょう。

ライトマップのUVを設定していきます。
追加した2つ目のUVを選択した状態で

画像3

 UV Editingモードに切り替えて、更に編集モードに。
全ての面を選択してから、メニューのUV、ライトマップパック。

画像4

ウインドウが開くので
「新規画像」をチェック。「画像サイズ」はご自由に。
2のべき乗ならOK。256とか1024とか。
私は4096にしちゃいました
なお、増やすとクソ長い計算時間が待っています。覚悟してください。

はい、UVが割り当てられました。
これでOKですが、こだわるなら手動で調整してもいいです。面倒ですけど!
もし手動でやる場合は目立つ部分を大きく!

この時点でモデルデータは完成しているので
FBXファイル作ります。

画像5

ファイル、エクスポート、FBX出力

画像6

Unity向けのFBXエクスポート設定、私はこんな感じにしてます。

はい、ライトマップのUVが割り当てられてFBXもできました。

[Blenderでのベイク]

次はBlenderでライトマップテクスチャを焼いていきます。

画像7

対象オブジェクトのマテリアルを確認。設定されてなかったら
足してください。ノードを使用は有効状態に。

画像8

Shading編集画面に切り替え。
テクスチャのノードを追加します。
追加、テクスチャ、画像テクスチャ。

画像9

1のとこ押すと先程ライトマップパックで作ったLightmap画像があるはず。
下のほうの2の項目、生成に。追加したテクスチャ画像のノードは
選択した状態にしといてください。

あと左側のウインドウ、4のとこでLightmapを選択しておくと
ベイク結果が見れます。

画像10

次にライトマップを焼くオブジェクトをすべて選択して
レンダープロパティ、レンダーエンジンをEeveeからCyclesに。

画像11

レンタープロパティ下の方のベイクで
設定はこんな感じ、余白は1pxでいいかな。ベイク押します!

しばらく時間がかかります。
先程テクスチャサイズを軽い気持ちで4096にしてしまった人は
きっと後悔している事でしょう。悔い改めてください。
私も後悔しました。はい。

画像12

はい、テクスチャにベイク結果が焼き込まれました。
忘れずに焼かれたテクスチャ画像を保存しておきましょう。
画像、保存、でOK。

これでライトマップが焼かれたテクスチャ画像が出来ました。

[Unityにもっていく]

焼いたライトマップをUnity側に取り込んでいきます。

まずバーチャルマーケット公式の出展者向け情報を見て
SDKのインポートとか色々な環境構築とかを済ませておいてください。
入稿用シーンの作成まで終わってる前提です。

画像13

具体的には、VketToolsでテンプレート押して
入稿用フォルダとシーンが初期化された状態までは終わらせてください。

Blender側で生成したFBXとライトマップテクスチャ画像、
あとあれば通常のテクスチャ画像をUnityにインポートします。

画像14

入稿ルールに従って
Projectの出展者ID以下のフォルダにドラッグ&ドロップ。

画像15

モデルの設定、Generate Lightmap UVsはチェック外してください。

画像16

マテリアルを展開

画像17

マテリアル設定です。
テクスチャ用のUVとライトマップ用のUV、
2つ設定できるシェーダーを使います。

Standard Shaderがこれに該当しますが、
このシェーダーは光源の影響を受けてしまうので
Blenderでの見た目と微妙に違ってしまう恐れがあります。

具体的には環境光の強さに影響をうけます。
あとレイヤーによってはワールドのダイレクトライトの影響もうけます。
まあそれで周囲になじむ効果もないではないですけどね。

周囲の光源の影響を受ける前提なら
Unity側でベイクするほうが良いですね……

自分で完全にライトを制御したいならUnlitなもの。
光源の影響を無視できるシェーダーがいいですね。軽いですし。

しかしそんなものは用意されていないので
自分でシェーダーを書く必要があります。
って言うのはあまりにもハードル上げ過ぎなので
ここにUnlitでUV2つ設定できるシェーダー置いておきます。
ご自由にお使いください

Shader "Unlit/UnlitLightmapShader"
{
	Properties
	{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
		_LightmapTex("Lightmap", 2D) = "gray" {}
	}
	SubShader
	{
		Tags{ "RenderType" = "Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
				float4 vertex : SV_POSITION;
			};

			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			sampler2D _LightmapTex;
			float4 _LightmapTex_ST;

			v2f vert(appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.uv2 = TRANSFORM_TEX(v.uv2, _LightmapTex);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				fixed4 col = _Color*tex2D(_MainTex, i.uv)*tex2D(_LightmapTex, i.uv2);
				return col;
			}
			ENDCG
		}
	}
}

気になる部分があったら適当に書き直して使ってね。

画像18

はい、マテリアル設定に戻ります。
シェーダーは先程のやつ
1つ目のテクスチャは通常のもの
そして2つ目に、ライトマップテクスチャを設定。

画像19

次、モデルをバーチャルマーケットの入稿規定に従って
Hierarchyに配置します。

ブースのオブジェクトならStatic側のフォルダに置いたうえで

画像20

Static設定をこんな感じにすると思いますが
その場合はここのLightmap Staticの項目はチェックしません。
ここチェックするとUnity側でのライトマップ処理対象になってしまいます。

画像21

Dynamic側のフォルダに置くこともできます。
なんらかのギミックとかに使うことも可。
Dynamicに置いた場合はStaticのチェックはしないでください。

画像22

はい、ライトマップテクスチャ適用されていますね
いい感じになっています

画像23

マテリアルのテクスチャ設定外してみるとこんな感じ。
ライトマップの効果の大きさがお解りいただけるかと!
これで自前ライトマップは完成です。

[Unityで焼く]

次、Blender側ではなく
Unity側で焼く場合の手順も解説していきます。
途中まではBlenderで焼く手順と同じです。
いきなりここから見てる人は「Blenderで焼く」のとこも見てね!

まずBlenderでの工程から。
UVを2つにふやしてUV Editingモードに入るとこまでは同じです。省略!

画像24

メニューのUV、ライトマップパック
「新規画像」はチェックなしでいいです。テクスチャ画像は作りません。
「画像サイズ」は512以下、バーチャルマーケットの
入稿制限に合わせます。
あ、これVket4時点では512でしたが将来変わるかもしれません。
Vket5以降の作業でここを見ている人は最新の入稿情報
確認してくださいね。

こっちではこれでFBX出力したらBlenderの作業はもう終了です。
Unity側の作業に進みます。

こちらも途中まで一緒。入稿用シーンの作成まで終わらせて
FBXとテクスチャ画像をUnityにインポート。
モデルの設定、Generate Lightmap UVsはチェック外してください。
マテリアルを展開。

今度はマテリアルは特にいじりません。Standard ShaderでもOK。

画像25

バーチャルマーケットの入稿規定に従ってHierarchy配置します。
Unity側でライトマップ焼くならStatic側のフォルダ固定です。

画像26

Static設定はこう、Lightmap Static項目はチェックします。

画像27

ライトを配置していきます
Blender側で配置しているなら設定値をいじるだけで良いです

なおライトにはかなり厳しい入稿制限があります。
Bakedのみ配置可能なのと
それぞれの設置数にも数の制限があります。
入稿ルールをしっかり確認してください。

画像28

あとバーチャルマーケット4時点での話ですが
Hierarchyの ReferenceObject/SampleWorldMesh 以下に
ブース以外の背景とかが用意されています。

この周囲の地面とか壁とかが有効になっていると
そっちも一緒にライトマップを焼いてしまうので
ライトマップテクスチャに余計な部分が入って
入稿制限を圧迫してしまいます。

画像29

これは無効にしてから

画像30

そしてLightng Settingウインドウでベイク。
ここのパラメータはいじっちゃダメです。運営側で焼くやつなので。
ベイクしてみましょう。

画像31

はい、焼けました。まあ見た目は参考程度に。
このベイクは入稿前に制限をクリアしているかどうか
チェックしているだけ
です。
この結果がそのまま本番環境で使われるわけではないです。

本番で使われるライトマップのベイクは、
入稿後に運営側がワールドの色々な光源も合わせて
全てまとめて焼いてくれます。
その結果は入稿後に下見期間とかあるはずなので
その時に確認してくださいね。

画像32

手元でベイクしてみた結果、512x512以下の1枚に収まっていればOK

はい、これでライトマップ設定終了です。
お疲れさまでした。

[次回予告]

はい、結構長くなっちゃいましたね。
そしてじわじわと難易度が上がってきました。
次回はいよいよモーションの作り方です。

モーションの解説は作るのにちょっと手間取りそうなので
間があくかもです。
生暖かく見守りつつお待ち下さい。

サポートは主においしそうな or 変な食べ物に費やされます。 サポートしてくれるととても嬉しいですが、お金はまず自分自身を優先して使ってくださいね。