Конвейер 3D-ассетов: от текстового промпта до готового для игры GLB (пошагово)
Создайте собственный конвейер 3D-ассетов
Весь путь, который проходит 3D-модель, созданная с помощью ИИ: промпт, сетка, ретопология, UV, текстура, сжатый GLB — и контрольные точки, которые не дают плохому ассету попасть в вашу игру.
Конвейер 3D-ассетов — это упорядоченный путь, который проходит модель от письменного описания до файла, загружаемого игрой: описать, сгенерировать сетку, выполнить ретопологию, развернуть UV и наложить текстуры, проверить, экспортировать сжатый GLB. В Neta Studio этот путь заканчивается файлом GLB, который конструктор 3D-игр передаёт Three.js прямо в браузере, поэтому каждый этап должен давать результат, который выдержит браузер, а не просто то, что хорошо выглядит в настольном вьюпорте.
Большинство конвейеров ломаются не громко, а тихо: модель, выглядевшая правильной в редакторе, попадает на уровень в сорок раз больше нужного, а текстура, чёткая на торсе, превращается в кашу на ботинках, потому что UV-острова упакованы с разной плотностью. Описанные ниже контрольные точки — из дешёвых: проход по каркасу, выделение неманифолдной геометрии, измерение ограничивающего объёма. Каждая занимает меньше минуты и ловит класс дефектов, который иначе стоит целого дня после того, как ассет оказался в сцене.
Краткий ответ: что такое конвейер 3D-ассетов
Конвейер 3D-ассетов — это упорядоченный набор этапов, превращающий описание в файл, который может загрузить игровой движок или браузер. Их шесть: описать объект словами, сгенерировать сетку, выполнить ретопологию, когда топология непригодна, развернуть UV и наложить текстуры на поверхность, проверить каркас, нормали и слоты материалов, затем экспортировать сжатый GLB. Ни один пункт из этого списка не является необязательным для объекта с текстурами, и у каждого этапа есть один контроль, который можно пройти перед переходом дальше.
Порядок важен, потому что этапы связаны зависимостями, а не образуют контрольный список. Ретопология переписывает индексы вершин, поэтому любая UV-развёртка или запечённая текстура, созданная до неё, выбрасывается. Текстуры создаются под UV, поэтому развёртка после текстурирования означает переделку текстуры. Сжатие необратимо и выполняется последним, поэтому внесённые им артефакты неотличимы от дефектов, которые следовало поймать тремя этапами раньше. Нарушение порядка этапов стоит не только времени: оно даёт файлы, проходящие проверку и всё равно ломающиеся в сцене.
Относитесь к каждому этапу как к производителю с контрактом. Этап 2 должен передать этапу 3 единую сетку в метрах с известным числом треугольников. Этап 4 должен передать этапу 5 модель, острова которой используют один набор текстур. Этап 6 должен передать среде выполнения файл в пределах бюджета размера, с материалами, которые взаимно однозначно соответствуют ожиданиям рендерера. Когда ассет позже ведёт себя неправильно, нарушенным обычно оказывается тот контракт, который так и не был записан.
Шесть станций с первого взгляда
У каждой станции один результат и один характерный отказ. Полезен именно столбец отказов — он говорит, что должен проверить контроль в конце этапа, прежде чем вы разрешите ассету двигаться дальше.
| Этап | Что производит | Самый частый отказ |
|---|---|---|
| 1. Описать | Промпт, фиксирующий силуэт, материал, масштаб, позу и стиль | Расплывчатый промпт возвращает слитый составной объект произвольного размера |
| 2. Сгенерировать сетку | Плотная треугольная сетка, обычно десятки тысяч треугольников | Открытая оболочка, внутренние грани, непригодный силуэт сбоку |
| 3. Выполнить ретопологию | Чистая сетка в выбранном бюджете треугольников | Ретопология выполнена после развёртки и уничтожила UV |
| 4. Развернуть и текстурировать | UV-острова, упакованные в 0–1, плюс набор альбедо и шероховатости | Неравномерная плотность текселей, швы поперёк видимой кривизны |
| 5. Проверить | Подтверждённые нормали, слоты материалов и каркас | Перевёрнутые нормали и пустые слоты материалов обнаруживаются после экспорта |
| 6. Экспортировать GLB | Сжатый .glb со встроенными текстурами | Сжатие геометрии применено к сетке со скелетной анимацией, а та затем теряет веса |
Этап 1: опишите объект
Промпт генерации — это спецификация, а не пожелание. Работу выполняют пять полей: силуэт, материал, масштаб, поза и стиль. Слова о силуэте определяют контур, вокруг которого строится сетка. Слова о материале определяют альбедо и шероховатость. Слова о масштабе задают пропорцию: пишите «рост 1,8 м», а не «высокий», потому что у генератора нет другого способа понять, делает он украшение на стол или здание. Слова о позе важны для всего, что будет оснащено скелетом: нейтральная A-поза или прямая стойка дают сетку, на которую можно надеть скелет, а динамичная поза фиксирует конечности в такой форме, которую трудно заново привязать к скелету.
Ещё два условия стоит добавлять каждый раз. Указывайте число частей — единый объект или отдельно тело и основание, — потому что слитая геометрия чаще всего мешает анимировать сгенерированный ассет или назначить материалы отдельным частям. И указывайте, что исключить: без цоколя, без фона, без плоскости земли. Генераторы заполняют пустое пространство правдоподобной на вид геометрией, и каждая лишняя поверхность, которую вы не просили, — это поверхность, которую потом придётся удалять.
- Слабый промпт«каменный фонарь» — без масштаба, материала, позы и числа частей. Генератор выбирает стиль и размер за вас, и вы получаете фантазийный фонарь высотой 9 м со светящимся кристаллом в топке и цоколем, слитым с основанием, на удаление которого уйдёт двадцать минут.
- Сильный промпт«одиночный каменный фонарь, высота 1,8 м, шестиугольный колпак, выветренный серый гранит с лишайником в швах, прямая вертикальная стойка, пустая топка, приглушённый реалистичный стиль, один объект, без цоколя, по центру в начале координат» — каждое условие соответствует одному решению, которое вы забрали у генератора. Масштаб задан, материал задан, поза нейтральная, число частей — одна.
Этап 2: сгенерируйте сетку
Генерация сетки — это либо текст в сетку, либо изображение в сетку. Ввод изображения даёт более точный контроль над силуэтом, потому что вы можете передать референс с уже нужными пропорциями; текстовый ввод быстрее для объектов с привычной формой. В любом случае на выходе получается сырьё, а не готовый к выпуску ассет. Сгенерированная сетка обычно гораздо плотнее, чем нужно, с неравномерным потоком треугольников и без учёта того, как поверхность будет разрезана под UV.
Проверьте три вещи, прежде чем делать что-либо ещё: замкнута ли сетка, разумен ли масштаб и укладывается ли число треугольников в сцену, которую вы строите. Если на третий вопрос ответ отрицательный, а объект никогда не деформируется, модификатор Decimate в режиме Collapse с сохранением силуэта — законный ответ: это не замена ретопологии, но для статичного пропса часто верный компромисс.
01
Проверка на герметичность: в Blender режим редактирования → «Выделить всё по признаку» → «Неманифолдная геометрия». Ожидаемое число — ноль. Отверстия под колпаком или вдоль конечности означают, что генератор создал открытую оболочку; она будет неправильно отбрасывать тень, и её нельзя подвергать булевым операциям, придавать ей толщину или печатать на 3D-принтере.
02
Дубликаты и внутренняя геометрия: Merge by Distance при 0,0001 м, затем снова посмотрите число треугольников. Внутренние грани на удивление часто переживают генерацию и проявляются тёмными пятнами при рендере с нормалями.
03
Масштаб: смотрите ограничивающий объём на панели N, а не во вьюпорте. Пропс, задуманный как 0,4 м, но измеряемый как 4 м, уменьшит тот, кто его размещает, и его объём столкновения будет ошибочен во столько же раз.
04
Бюджет треугольников: примерно 500–3 000 треугольников для пропса, 5 000–15 000 для герой-объекта, меньше 500 для фонового окружения. Исходная сетка на 200 000 треугольников нормальна для генератора; для готового ассета — нет.
Этап 3: выполняйте ретопологию, когда сетка грязная
Чистая квадовая топология важна, когда поверхность должна работать после экспорта. Это касается всего, что деформируется, — персонажей, ткани, флагов, растительности, — потому что рёберные петли определяют, сгибается локоть или сминается. Это также важно, когда вы планируете подразделение, когда собираетесь запекать детали высокой полигональности в карту нормалей (для чего нужны равномерно распределённые квады и стабильная UV-раскладка), когда кто-то другой будет позже править силуэт и когда вам нужны предсказуемые упрощённые версии того же объекта.
Это неважно для статичного пропса, который видно издалека, для твёрдого объекта, чей силуэт уже правильный, и для всего, что в итоге окажется меньше примерно тысячи треугольников. В таких случаях правильный ответ — децимированная сетка с верными нормалями и чистым контуром, а час на квадовый поток — час, который рендер вам не вернёт.
Порядок фиксирован: сначала ремеш или децимация, затем развёртка. Руководство по UV-развёртке в Blender исходит из того, что к началу разрезания швов сетка окончательна, и в этом весь смысл: ретопология меняет индексы вершин и поток рёбер, поэтому UV-карта, сделанная до неё, больше не существует в осмысленном виде, а каждая текстура, нарисованная по ней, смещена. Сделайте ремеш, примените его, затем следуйте документации по развёртке. Voxel Remesh с шагом 0,01–0,02 м на объекте размером в метр с последующим QuadriFlow до целевого числа граней — стандартный путь; Decimate Collapse — быстрый путь для статичной геометрии.
Этап 4: разверните UV и наложите текстуры
Развёртка разрезает поверхность на острова, расплющивает каждый с минимальными искажениями и упаковывает их в UV-квадрат 0–1. Smart UV Project за секунды даёт приемлемую основу для твёрдых объектов. Персонажи и всё с видимой кривизной заслуживают швов, размещённых вручную: по внутренней стороне конечности, вдоль спины, за ухом — но никогда поперёк середины формы, которую камера увидит спереди.
Плотность текселей — число, определяющее, выглядит ли модель согласованно. Это разрешение текстуры на единицу мира: карта 1024×1024, растянутая на один квадратный метр, даёт около 1 024 пикселей на метр. Если голова персонажа получает 1 024 пикселя на метр, а ботинки — 300, ботинки в том же кадре заметно мягче, и никакая резкость это не исправит. Задайте плотность один раз, затем масштабируйте каждый остров под неё и держите острова в пределах примерно 10–20 % друг от друга.
Упаковке нужен запас, а не только эффективность. Оставляйте 4 пикселя отступа при 1024 и 8 при 2048, чтобы мипмаппинг и билинейная фильтрация не затягивали соседние острова в шов. Для веб-сборки держите UV строго внутри 0–1: тайлы UDIM поддерживаются одними экспортёрами и не поддерживаются большинством браузерных загрузчиков, а второй набор текстур стоит второго вызова отрисовки. Если часть модели никогда не видна, потратьте её UV-пространство на видимые части, а не удаляйте грани: отсутствующие грани потом труднее диагностировать, чем чуть менее плотную скрытую область.
Этап 5: проверьте перед экспортом
Проверка состоит из трёх отдельных проходов, каждый ищет определённый класс дефектов. Делайте их в этом порядке, потому что проблема с нормалями скрывает проблему с материалом, а проблема с материалом скрывает проблему с каркасом.
Каркас
Переключитесь на каркас и оцените распределение треугольников. Ищите длинные тонкие иглы, которые плохо затеняются и ещё хуже деформируются; n-угольники, которые экспортёр glTF триангулирует сам и иногда в направлении, которое вы не выбирали; и плотность не там, где нужно, — плоская стена на 6 000 треугольников при изогнутом колпаке на 200. Плотность должна следовать за кривизной и деформацией, а не за порядком, в котором генератор выдавал грани.
Нормали
Пересчитайте наружу, затем посмотрите на модель при одном направленном источнике света с включённым отсечением задних граней. Перевёрнутые грани выглядят чёрными пятнами или исчезают совсем. Проверьте и жёсткие рёбра: угол автосглаживания около 30° подходит твёрдым объектам, 60° — органическим, а пользовательские расщеплённые нормали первыми тихо портятся при преобразовании формата. Если модель чёрная только после экспорта, экспортируйте снова без сжатия геометрии, чтобы понять, виноват компрессор или сетка.
Слоты материалов
Посчитайте слоты. Сгенерированные сетки регулярно приходят с шестью, два из которых пусты, а ещё два указывают на дубликаты одного и того же изображения. Каждый материал — это вызов отрисовки, поэтому объединяйте до одного материала с одной текстурой, где объект это позволяет, удаляйте пустые слоты и проверяйте режим альфа-канала: BLEND требует сортировки и расходует заполнение, MASK дешевле и обычно правильнее для листвы и ограждений. Проверьте и флаг двусторонности — если он включён, затеняемая поверхность удваивается без визуальной выгоды.
Этап 6: экспортируйте сжатый GLB
Для браузерной сборки задайте бюджет размера до экспорта, а не после. Один пропс должен укладываться примерно в 1 МБ, герой-персонаж — в 2–4 МБ, а вся сцена — примерно в 15–20 МБ, если вы ждёте загрузки на ноутбуке среднего класса без заметной задержки. Бюджет определяют текстуры: 512 пикселей для фоновых объектов, 1024 для пропсов, 2048 — только для того, к чему камера подходит близко.
Сжатие выполняет две разные задачи, и их стоит разделять. Сжатие геометрии — Draco или Meshopt — квантует позиции вершин, нормали и UV до фиксированного числа бит и переупорядочивает буфер. Draco обычно даёт меньший файл; Meshopt декодируется быстрее, что важно на мобильных устройствах. Оба необратимы на уровне точности и оба могут нарушить веса скелета и морф-цели, если сетка изначально была нечистой. Сжатие текстур через KTX2/Basis сохраняет изображение сжатым в памяти графического процессора вместо декодирования в сырой RGBA — ценой расширения, которое должен поддерживать ваш загрузчик: базовая спецификация glTF гарантирует только PNG и JPEG.
Всегда открывайте экспортированный файл в просмотрщике GLB или импортируйте его в конструктор 3D-игр, прежде чем считать работу законченной. Экспортёр — это место, где переворачиваются нормали, слоты материалов схлопываются в один, а масштаб уплывает, потому что преобразование применили к родителю, а не к сетке. Проверка в инструменте, создавшем ассет, ничего не доказывает; проверка в загрузчике, с которым вы действительно будете выпускать проект, доказывает всё.
Где конвейеры ломаются и как это заметить
Симптомы ниже охватывают большую часть того, что идёт не так. Заметьте, что четыре из шести видны за один проход проверки, и ни один не требует открывать исходный файл, если правильно протестировать экспортированный GLB.
Почему отказы конвейера 3D-ассетов сосредоточены на двух этапах
Генерация и экспорт дают большинство дефектов, но по противоположным причинам. Генерация не ограничена — модели не сказали, чем она должна быть, поэтому она изобретает масштаб, число частей и внутреннюю геометрию. Экспорт разрушителен — это первая точка, где данные квантуются, переупорядочиваются и упаковываются в один файл, поэтому каждая скрытая проблема сетки проявляется сразу. Этапы с 3 по 5 существуют, чтобы вывести дефекты из разрушительного конца цепочки туда, где вы всё ещё можете ясно их видеть.
| Симптом | Причина | Исправление |
|---|---|---|
| Модель рендерится чисто чёрной или невидимой в сцене | Перевёрнутые или отсутствующие нормали вершин, иногда появляются при экспорте | Пересчитайте наружу перед экспортом; экспортируйте повторно без сжатия, чтобы изолировать причину |
| Объект в уровне слишком большой или слишком маленький | Несовпадение единиц — работа велась в сантиметрах при ожидаемых метрах, или масштаб так и не применён | Измерьте ограничивающий объём, примените масштаб, задайте метры единицей сцены до экспорта |
| Текстура чёткая на торсе и размытая на ботинках | Неравномерная плотность текселей по UV-островам | Перепакуйте по плотности в мировом пространстве и сведите острова в пределы 20 % друг от друга |
| GLB занимает десятки мегабайт и вкладка зависает | Несжатая геометрия плюс PNG-текстуры 4096 пикселей | Снизьте до 1024/2048, примените Draco или Meshopt, удалите неиспользуемые материалы и скрытые грани |
| Сетка рвётся на локте при анимации | Ретопология сделана после привязки скелета, или вершины вдоль шва не сварены | Делайте ретопологию до привязки; объедините по расстоянию и перепроверьте веса скелета |
| Яркие линии или свечение вдоль UV-швов | Нет отступа по краям островов, поэтому мипмапы берут соседний остров | Добавьте отступ 4–8 пикселей при 1024, запекайте с отступом, держите острова внутри 0–1 |
Войдите в мир, которому он принадлежит
Спрайт — это персонаж, которому негде стоять. Последний шаг — тот, которого не предлагает никто другой: возьмите только что собранный лист и поместите его в мир, по которому можно ходить, — небольшой остров, планету, дождливый угол улицы. Каждый мир на этом сайте создан из одного письменного описания и опубликован как страница, в которую можно играть.
Частые вопросы
Что такое конвейер 3D-ассетов? +
Упорядоченный набор этапов, превращающий описание в загружаемый файл: описать, сгенерировать сетку, выполнить ретопологию, развернуть UV и наложить текстуры, проверить, экспортировать сжатый GLB. Порядок задан зависимостями: ретопология уничтожает UV, текстуры зависят от UV, а сжатие скрывает дефекты, внесённые раньше.
Почему GLB, а не FBX или OBJ? +
GLB — единый бинарный контейнер, определённый спецификацией glTF: геометрия, материалы, текстуры и скелетная анимация в одном файле, который Three.js и большинство движков читают без конвертера. OBJ не несёт данных о материалах или анимации, а FBX требует проприетарного комплекта разработки. Для браузерной сборки GLB — единственный формат, не требующий второго инструмента в цепочке.
Нужна ли мне ретопология? +
Только когда поверхность должна работать после экспорта: деформация, подразделение или запекание деталей высокой полигональности в карту нормалей. Статичный пропс с правильным силуэтом может выпускаться децимированным. Делайте ретопологию до развёртки и до привязки скелета, никогда после.
Сколько треугольников — это слишком много? +
Считайте бюджет по покрытию экрана и числу экземпляров, а не по одному числу. Примерно 500–3 000 треугольников подходит пропсу, 5 000–15 000 — герой-объекту, меньше 500 — фоновому окружению. Объект, занимающий малую часть экрана и появляющийся пятьдесят раз, следует считать в пикселях, а не в треугольниках.
Можно ли пропустить UV-развёртку? +
Только если объект использует плоские цвета или процедурный шейдер, которому не нужны UV, — и этот шейдер не переживёт экспорт, потому что glTF несёт запечённые PBR-текстуры, а не графы узлов. Всему с нарисованным или запечённым альбедо нужна настоящая UV-раскладка, поэтому разворачивайте до текстурирования.
Где тестировать GLB? +
В загрузчике, с которым вы действительно будете выпускать проект. Импортируйте файл в конструктор 3D-игр или откройте в отдельном просмотрщике glTF и проверьте четыре вещи: масштаб относительно известного ориентира, нормали при одном источнике света, сохранились ли материал и режим альфа-канала, и размер файла по сети с отключённым кэшем.
Вернуться в конструктор 3D-игр
Все 31 готовый 3D-мир, игры и сцены собраны на одной странице — играть можно в каждую.