LixelStudio メッシュで 3DGS をリライティングする
このプラグインはハイブリッドリライティングに対応しています。3DGS と同じスケールのメッシュを組み合わせることで、3DGS にメッシュに近いライティング応答を与え、セルフシャドウも表現できます。
仕上がりは 3DGS の下に置くメッシュの形状精度で決まります。メッシュが 3DGS に一致しているほど、ライティング応答と影が自然になります。
仕組みとパラメーターはプロキシメッシュ、法線モードの選び方は法線とライティングを参照してください。
どちらのメッシュを使うか
LCC Studio と LixelStudio のどちらでもメッシュを生成できますが、用途が異なります。
| LCC Studio メッシュ | LixelStudio メッシュ | |
|---|---|---|
| 表面の精度 | 粗い | 実際の形状に近い |
| ファイルサイズ | 小さい | 大きい |
| 向いている用途 | コリジョン判定 | リライティング |
コリジョン用途なら LCC Studio メッシュで十分です(コリジョンを参照)。リライティングには LixelStudio メッシュを使います。
LCC Studio メッシュ:


LixelStudio メッシュ:


手順 1:タイル分割されたモデルを 1 つのフォルダーにまとめる
LixelStudio はメッシュをタイル単位で書き出します。シーンが大きいとフォルダーが多数生成され、それぞれに .obj ファイルとテクスチャが入っています。Unreal Engine に取り込む前に 1 つのメッシュへ結合しないと、独立した .obj が大量にできてしまいます。
以下は Blender を使った手順ですが、他の 3D ツールでも同じ考え方です。Blender は公式サイトからダウンロードします。
Blender はフォルダーをまとめてドラッグする操作に対応していないため、各サブフォルダーに散らばった .obj を同じ階層に集める必要があります。数十個のフォルダーを手作業で扱うのは現実的ではないので、PowerShell のコマンド 1 行で済ませます。
すべてのサブフォルダーを含むルートフォルダーを開き、アドレスバーに powershell と入力して Enter を押します。現在のディレクトリでターミナルが開きます。

エクスプローラーのアドレスバーに powershell と入力する
次のコマンドをコピーして貼り付けます。
Get-ChildItem -Recurse -File | Move-Item -Destination .
注:このコマンドはサブフォルダー内のすべてのファイルを現在のディレクトリへ移動します。実行前に正しいフォルダーにいることを確認してください。たとえばフォルダー A に B と C が含まれている場合、A のアドレスバーから PowerShell を開きます。実行後、B と C のファイルはすべて A に移動します。

実行前のフォルダー構成

コマンドを貼り付けて実行する
貼り付けたら Enter で実行します。数秒かかります。新しいプロンプトが表示されれば完了です。
これですべて取り出されました。いくつかのサブフォルダーを開いて、中が空になっていることを確認します。

すべての .obj とテクスチャが同じ階層に集まった状態
手順 2:Blender で 1 つのファイルに結合する
Ctrl + A ですべてのファイルを選択し、Blender にドラッグします。

すべてのファイルを選択する

Blender にドラッグする
Import Wavefront OBJ をクリックしてインポートします。向きを正しくするため、Up Axis を Z、Forward Axis を X に設定します。

Up Axis を Z、Forward Axis を X に設定する
これですべてのタイルがインポートされます。

すべてのタイルがインポートされた状態
A ですべてのタイルを選択し、Ctrl + J で 1 つのメッシュに結合します。シーンが大きい場合は 1 分ほどかかるので、完了まで待ちます。

結合されて 1 つになったメッシュ
注:シーン全体をリライティングする必要がない場合は、不要な部分を削除すると Unreal Engine でのパフォーマンスが向上します。
手順 3:ドローコールを削減する
このメッシュをリライティング目的で Unreal Engine に取り込む場合、マテリアルはすべて不要です。見た目は 3DGS が担い、プロキシメッシュは計算にだけ使われるため、マテリアルは役に立たずリソースを消費します。
LixelStudio メッシュのテクスチャ 1 枚は Unreal Engine では 1 ドローコールに相当します。規模が大きくなるとドローコールが大量に発生し、そのままプロキシメッシュとして使うと処理が重くなります。
Collection でメッシュを選択し、Blender の Python コンソールでドローコール数を確認します。

Python コンソールに切り替える
次のコマンドを貼り付けて Enter で実行します。
obj = bpy.context.object
print("Material slots:", len(obj.data.materials))

出力された数値がドローコール数
スクリーンショットのメッシュはドローコールが 8859 回あります。
削減するには、既存のマテリアルをすべて削除して単一のマテリアルに置き換えます。
import bpy
# Get the currently selected object in Blender
obj = bpy.context.object
# Make sure a valid Mesh object is selected
if obj is None or obj.type != "MESH":
raise Exception("Please select a Mesh object first.")
# Create a new white clay material
mat = bpy.data.materials.new("M_White_Clay")
mat.use_nodes = True
# Configure the Principled BSDF shader settings
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs["Base Color"].default_value = (1, 1, 1, 1) # White color
bsdf.inputs["Roughness"].default_value = 1.0 # Fully rough / matte surface
bsdf.inputs["Metallic"].default_value = 0.0 # Non-metallic material
bsdf.inputs["Alpha"].default_value = 1.0 # Fully opaque
# Remove all existing material slots from the mesh
obj.data.materials.clear()
# Add the single new white material
obj.data.materials.append(mat)
# Assign every face to material slot 0
for poly in obj.data.polygons:
poly.material_index = 0
# Print the result for verification
print("Done")
print("Material slots:", len(obj.data.materials))
print("Used material indices:", len(set(p.material_index for p in obj.data.polygons)))
print("Estimated draw calls:", len(set(p.material_index for p in obj.data.polygons)))
実行後、ドローコール数が 1 回に減っていることを確認します。

ドローコールが 1 回に減った状態
手順 4:Unreal Engine に取り込む
メッシュを .obj または .fbx で書き出し、Unreal Engine にインポートします。

Unreal Engine に取り込んだ後のメッシュ
続いてプロキシメッシュの手順に従って ProxyMesh Actor を配置し、法線モードを ProxyMesh に設定します。
思ったような結果にならない場合はプロキシメッシュのトラブルシューティングを参照してください。