Переосвещение 3DGS с помощью меша LixelStudio
Плагин поддерживает гибридное переосвещение: используйте 3DGS вместе с мешем того же масштаба, чтобы 3DGS получил отклик на освещение, близкий к мешу, и мог давать самозатенение.
Результат зависит от геометрической точности меша под 3DGS. Чем лучше меш совпадает с 3DGS, тем достовернее отклик на освещение и тени.
Принцип работы и параметры см. в Прокси-меше, выбор режима нормалей — в Нормалях и освещении.
Какой меш выбрать
LCC Studio и LixelStudio оба создают меши, но назначение у них разное.
| Меш LCC Studio | Меш LixelStudio | |
|---|---|---|
| Точность поверхности | Грубее | Ближе к реальной форме |
| Размер файла | Небольшой | Большой |
| Подходит для | Определения коллизий | Переосвещения |
Для коллизий достаточно меша LCC Studio, см. Коллизии. Для переосвещения выбирайте меш LixelStudio.
Меш LCC Studio:


Меш LixelStudio:


Шаг 1: соберите модели по частям в одну папку
LixelStudio экспортирует меши по частям. У крупной сцены получается много папок, в каждой — файл .obj и текстуры. Перед импортом в Unreal Engine их нужно объединить в один меш, иначе вы получите множество отдельных .obj.
Ниже показан порядок действий в Blender, любой другой трёхмерный редактор работает так же. Blender доступен на официальном сайте.
Blender не принимает набор папок целиком, поэтому файлы .obj, разбросанные по вложенным папкам, нужно сначала поднять на один уровень. Перетаскивать десятки папок вручную нереально, задачу решает одна команда PowerShell.
Откройте корневую папку со всеми вложенными папками, введите в адресной строке powershell и нажмите Enter. Терминал откроется в текущем каталоге.

Ввод powershell в адресной строке проводника
Скопируйте и вставьте следующую команду:
Get-ChildItem -Recurse -File | Move-Item -Destination .
Примечание: команда поднимает все файлы из вложенных папок в текущий каталог. Перед запуском убедитесь, что находитесь в нужной папке. Например, если в папке A находятся B и C, откройте PowerShell из адресной строки A: после выполнения все файлы из B и C окажутся в A.

Структура папок до запуска

Вставка и выполнение команды
После вставки нажмите Enter. Это займёт несколько секунд. Новое приглашение командной строки означает, что команда выполнена.
Теперь всё содержимое поднято наверх. Откройте несколько вложенных папок и убедитесь, что они пусты.

Все файлы .obj и текстуры собраны на одном уровне
Шаг 2: объедините в один файл в Blender
Нажмите Ctrl + A, чтобы выделить все файлы, и перетащите их в Blender.

Выделение всех файлов

Перетаскивание в Blender
Нажмите Import Wavefront OBJ для импорта. Чтобы ориентация была правильной, задайте Up Axis равным Z, а Forward Axis равным X.

Up Axis задан как Z, Forward Axis как X
Теперь все части импортированы.

Все части импортированы
Нажмите A, чтобы выделить все части, затем Ctrl + J, чтобы объединить их в один меш. У крупной сцены это займёт около минуты, дайте операции завершиться.

После объединения получается один меш
Примечание: если переосвещение нужно не для всей сцены, удалите ненужные части. Это повысит производительность в Unreal Engine.
Шаг 3: сократите вызовы рендеринга
Когда этот меш попадает в Unreal Engine для переосвещения, все его материалы оказываются ненужными. Изображение даёт 3DGS, прокси-меш участвует только в расчётах, а материалы бесполезны и расходуют ресурсы.
Каждая текстура меша LixelStudio в Unreal Engine — это один вызов рендеринга. При большом масштабе вызовов рендеринга получается очень много, и использование такого меша в качестве прокси напрямую приводит к рывкам.
Выберите меш в Collection и посмотрите количество вызовов рендеринга через консоль Python в Blender.

Переключение на консоль 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)))
После выполнения убедитесь, что количество вызовов рендеринга снизилось до одного.

Вызовы рендеринга сокращены до одного
Шаг 4: импортируйте в Unreal Engine
Экспортируйте меш как .obj или .fbx и импортируйте его в Unreal Engine.

Меш после импорта в Unreal Engine
Затем выполните шаги из Прокси-меша, чтобы разместить Actor ProxyMesh и задать режим нормалей ProxyMesh.
Если результат неверный, см. Устранение неполадок прокси-меша.