Из Blender в продакшен: полный обзор сжатия от начала до конца
На данном этапе серии инструменты, принципы и критерии выбора уже рассмотрены. В этой финальной статье мы соберём всё в рабочий конвейер: начиная с реальной модели Blender, сжимаем поэтапно, фиксируя размер файла, VRAM и время загрузки на каждом шаге, и в итоге проверим, можно ли превратить 50-мегабайтный тяжёлый объект в 5-мегабайтную модель, которая открывается мгновенно на телефоне.
Целевая аудитория: кто уже прочитал предыдущие пять статей и готов приступить к делу. Здесь нет новых концепций — только готовые к копированию потоки, команды и скрипты.
Точка отправления: реальная PBR-модель
В качестве образца используем типичную модель для e-commerce: детализированную продукт с полным набором PBR-карт.
| Начальные метрики | Значение |
|---|---|
| Исходный файл Blender | ~120 МБ (включая неэкспортированный high-poly) |
| Экспортированный GLB (float32 + PNG) | ~50 МБ |
| Количество вершин | ~180 тыс. |
| Карты | 6 × 4096x4096 (альбедо, нормали, шероховатость, металличность, AO, эмиссия) |
| Использование VRAM (6 полностью распакованных) | ~520 МБ |
| Цель | Файл ≤ 5 МБ, VRAM контролируемый, мгновенное открытие на мобильном |
50 МБ файла и 520 МБ VRAM — эта модель точно вылетит на мобильном. Двигаемся поэтапно.
Шаг 0: правильный экспорт из Blender
Первые ворота сжатия — это на самом деле экспорт; многие теряются уже здесь.
Ключевые настройки при экспорте glTF из Blender:
- Формат:
glTF Binary (.glb)(один файл, удобно передавать) - Геометрия: отметьте
Normals,Tangents(PBR-нормали требуют тангентов) - UV: убедитесь, что экспортируется (включено по умолчанию)
- Текстуры:
AutomaticилиJPEG(формат текстур здесь не важен; мы пересожмём позже — но убедитесь, что они экспортируются) - Сжатие: не отмечайте встроенное сжатие сеток Blender; мы используем более специализированные инструменты
- Трансформация:
+Y Up(стандарт glTF) - Данные: отмечайте только то, что нужно (не экспортируйте анимацию, камеры, источники света, если они не нужны, чтобы уменьшить размер)
После экспорта model.glb: 50 МБ, 6 PNG-карт, вершины float32. Это наш базовый уровень.
Первая типичная ошибка как раз здесь: Blender по умолчанию экспортирует неиспользуемые сетки и скрытые вспомогательные объекты. Перед экспортом выполните
File > Clean Up > Purge Orphansи в структуре сцены выберите только объекты для экспорта.
Полный конвейер: общая картина
Нарисуйте всю цепочку, чтобы иметь ментальную карту:
Исходный файл Blender
│ экспорт .glb (float32 + PNG) 50 МБ
▼
[1] Дедупликация + сварка дублирующихся вершин (gltf-transform) ~45 МБ
│
[2] Сжатие вершин: MeshOpt (gltfpack / gltf-transform) ~30 МБ
│
[3] Сжатие текстур: PNG → KTX2 (ETC1S/UASTC) ~6 МБ
│
[4] (опционально) Упрощение геометрии LOD (simplify) ~4-5 МБ
▼
Итоговая модель-final.glb ~5 МБ
│
Загрузка в движок (Three.js / Babylon.js) → транскодирование на лету → отправка
Цифры для каждого шага отслеживаются в таблицах ниже.
Инструменты: какой выбрать
Существует несколько инструментов сжатия; вот сравнение, чтобы вы не ошиблись с выбором:
| Инструмент | Сильная сторона | Слабая сторона | Подходит для |
|---|---|---|---|
| gltf-transform | Универсал, текстуры+вершины за один раз; доступен через API, скриптуется | Максимальный коэффициент уступает специализированным инструментам | Рекомендуемый основной инструмент для большинства сценариев |
| gltfpack | Профи в сжатии вершин, нативный MeshOpt | Слабое сжатие текстур | Вершинно-ёмкие модели, тонкая настройка MeshOpt |
| toktx | Самый профессиональный инструмент для текстур, максимальное число параметров | Только текстуры, не целые модели | Тонкая настройка одной текстуры |
| gltf-pipeline | Ветеран, поддерживает Draco | Неактивное обслуживание, мало функций | Существующие проекты с унаследованным Draco |
| Онлайн-инструменты (gltf.report) | Нулевая установка | Не для автоматизации/массовой обработки | Эксперименты, разовые задачи |
Основная рекомендация: запустите весь поток через gltf-transform; используйте gltfpack для тонкой настройки вершин и toktx для настройки отдельных текстур по необходимости. Все шаги ниже основаны на gltf-transform.
Шаг 1: дедупликация + сварка
В моделях часто бывают дублирующиеся вершины, неиспользуемые узлы и материалы. Сначала проведите очистку.
gltf-transform optimize model.glb step1.glb --weld --prune
| Этап | Размер файла | VRAM | Изменение |
|---|---|---|---|
| Базовый уровень | 50 МБ | ~520 МБ | — |
| Шаг 1 дедупликация | 45 МБ | ~520 МБ | -5 МБ (VRAM не изменился, потому что текстуры всё ещё на месте) |
VRAM почти не сдвинулся — это ожидаемо. Дедупликация экономит в основном вершины и структуру; текстуры — тяжеловес по VRAM.
Шаг 2: сжатие вершин MeshOpt
gltf-transform optimize step1.glb step2.glb --meshopt --weld --prune
--meshopt квантизирует вершины до 16 бит и применяет беспотерьное кодирование MeshOpt, автоматически добавляя расширение EXT_meshopt_compression.
| Этап | Размер файла | VRAM | Изменение |
|---|---|---|---|
| Шаг 1 | 45 МБ | ~520 МБ | — |
| Шаг 2 + MeshOpt | 30 МБ | ~520 МБ | -15 МБ (часть вершин) |
VRAM всё ещё ~520 МБ? Верно — потому что вершины занимают малую долю VRAM (10-20%); их уменьшение оказывает ограниченное воздействие на VRAM. Настоящий монстр по VRAM — текстуры, которые обрабатываются дальше.
Шаг 3: сжатие текстур PNG → KTX2
Этот шаг даёт максимальную отдачу.
gltf-transform optimize step2.glb step3.glb \
--texture-compress basisu \
--meshopt --weld --prune
--texture-compress basisu автоматически определяет каждую карту: цветовые карты (альбедо, эмиссия) → ETC1S; карты данных (нормали, шероховатость, металличность, AO) → UASTC.
| Этап | Размер файла | VRAM | Изменение |
|---|---|---|---|
| Шаг 2 | 30 МБ | ~520 МБ | — |
| Шаг 3 + KTX2 | 6 МБ | ~70 МБ | -24 МБ файл / -450 МБ VRAM |
Этот шаг — переломный момент во всём конвейере:
- Файл падает с 30 МБ до 6 МБ
- VRAM падает с 520 МБ до ~70 МБ — потому что шесть карт 4096 переходят из «распакованных сырых пикселей» в «блочно сжатые», каждая с ~87 МБ до ~11-14 МБ
VRAM падает на порядок — вот ключ к тому, будет ли это работать на мобильных.
Шаг 4: (опционально) упрощение геометрии
Если нужен ещё меньший размер и сцена позволяет снизить точность вершин, добавьте упрощение геометрии.
gltf-transform optimize step3.glb final.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--weld --prune
--simplify-ratio 0.5 означает сохранить примерно 50% вершин.
| Этап | Размер файла | VRAM | Изменение |
|---|---|---|---|
| Шаг 3 | 6 МБ | ~70 МБ | — |
| Шаг 4 + simplify 0.5 | 4.5 МБ | ~70 МБ | -1.5 МБ (VRAM примерно без изменений) |
Упрощение в основном экономит размер файла; воздействие на VRAM мало. Цена — уменьшение детализации модели; видно при приближении. Страницы товаров в e-commerce обычно не стоит чрезмерно упрощать; здания/крупные сцены — отличный вариант.
Полная таблица отслеживания эффекта
Сложим четыре шага для полной картины (на основе приведённого примера; цифры иллюстративны по масштабу):
| Шаг | Размер файла | VRAM | Совокупное уменьшение |
|---|---|---|---|
| Базовый уровень (float32 + PNG) | 50 МБ | ~520 МБ | — |
| + дедупликация и сварка | 45 МБ | ~520 МБ | -10% |
| + вершины MeshOpt | 30 МБ | ~520 МБ | -40% |
| + текстуры KTX2 | 6 МБ | ~70 МБ | -88% файл / -87% VRAM |
| + упрощение геометрии (0.5) | 4.5 МБ | ~70 МБ | -91% файл |
Вывод: сжатие текстур даёт подавляющее большинство выигрыша по размеру и VRAM. Сжатие вершин — добавка; сжатие текстур — спасение. Это полностью соответствует тезису первой статьи: текстуры — 80% размера, поэтому их оптимизация даёт максимальную отдачу.
Версия одной командой: ленивое одноразовое сжатие
Если не хотите проходить поэтапно, выполните все оптимизации за один раз:
gltf-transform optimize model.glb model-final.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--weld --prune
Эта одна команда = дедупликация + сварка + вершины MeshOpt + текстуры KTX2 + упрощение геометрии. Этого достаточно для 90% сценариев; пошаговый подход нужен в основном для понимания и тонкой настройки.
Не хотите настраивать окружение? Используйте онлайн-компрессор Any3D
Запуск этого конвейера gltf-transform локально означает установку Node, настройку инструментов и запоминание флагов. Онлайн-инструмент сжатия Any3D устраняет всё это:
- Нет скриптов для скачивания, нет окружения для установки — просто откройте страницу
- Ваша модель никогда не попадает на сервер — всё обрабатывается локально в вашем браузере
- Визуальная настройка — регулируйте текстуры KTX2, вершины MeshOpt и упрощение геометрии ползунками с предпросмотром в реальном времени
- Один клик, несколько версий — экспорт сжатых результатов для мобильных / десктопа / VR
Выберите GLB, укажите целевую платформу, нажмите один раз — и готово. Под капотом — тот же движок (gltf-transform), но без барьеров — терминал не нужен.
Типичные ошибки и вопросы
Модель почернела / текстуры не отображаются после сжатия
- В 99% случаев это цветовое пространство: цветовая карта не получила sRGB. В Three.js:
texture.colorSpace = THREE.SRGBColorSpace. - Забыли
--srgbдля цветовых карт в toktx.
Освещение выглядит неправильно после сжатия карт нормалей
- Карта нормалей использовала ETC1S; переключитесь на UASTC.
- Карта нормалей в стиле DirectX (зелёный канал вниз); движок ожидает OpenGL, поэтому инвертируйте канал G.
Мобильная загрузка застревает на первом рендере
- Проверьте, загружаете ли вы декодер Draco wasm (дополнительный запрос). На мобильных предпочтительнее MeshOpt.
- Путь к транскодеру KTX2 настроен неправильно; транскодирование не удаётся, и выполняется откат на декодирование CPU.
Сжатый файл стал больше вместо уменьшения
- Карта слишком мала (< 128 пикселей); KTX2 не стоит использовать — блочное сжатие имеет фиксированный overhead.
- Модель уже была сжата один раз; повторное прохождение не даёт выигрыша (даже отрицательный).
Модель развалилась после упрощения
--simplify-ratioустановлен слишком низко; поднимите до 0.7-0.8.- Упрощение хорошо работает с твёрдыми поверхностями (механика, архитектура) и склонно ломать органические формы (персонажи).
KTX2 не загружается в некоторых браузерах
- Старый Safari / старый WebView не поддерживают его. Предоставьте фоллбэк на PNG/WebP или используйте поле
fallbackрасширенияKHR_texture_basisuв качестве страховки.
Шпаргалка по серии
Суть всех шести статей в одной таблице — сохраните её.
Состав размера
| Компонент | Доля | Инструмент оптимизации |
|---|---|---|
| Карты текстур | 70-85% | KTX2 (максимальный выигрыш) |
| Данные вершин | 10-20% | MeshOpt / квантизация / Draco |
| Данные анимации | 0-15% | Уменьшение ключевых кадров / сжатие |
| Прочее | < 2% | Дедупликация |
Формула VRAM
VRAM традиционных форматов = ширина * высота * 4 байта * 1.333 (с мипмапами)
VRAM блочно сжатого KTX2 ≈ выше / 4 (ETC1S) или / 2 (UASTC)
Выбор сжатия вершин
| Сценарий | Рекомендация |
|---|---|
| Нулевые зависимости, максимально просто | Простая квантизация (KHR_mesh_quantization) |
| Сбалансированный, основной выбор для веба | MeshOpt |
| Максимальный коэффициент, допустима задержка декодирования | Draco |
| Mini Program / чувствительность к размеру пакета | Простая квантизация / MeshOpt; избегайте Draco |
Выбор сжатия текстур
| Тип карты | Рекомендуемая кодировка |
|---|---|
| альбедо / эмиссия (цвет) | KTX2 ETC1S |
| нормали / шероховатость / металличность / AO (данные) | KTX2 UASTC |
| Десктопный веб, погоня за скоростью загрузки | WebP / AVIF |
| Маленькие карты (< 128 пикселей) | Оставьте PNG, не используйте KTX2 |
Команда одного шага
# Полная оптимизация (текстуры + вершины + упрощение)
gltf-transform optimize model.glb model-final.glb \
--texture-compress basisu --meshopt \
--simplify --simplify-ratio 0.5 --weld --prune
Шпаргалка по платформам
| Платформа | Текстуры | Вершины |
|---|---|---|
| Десктопный веб | WebP / KTX2 | MeshOpt |
| Мобильный веб | KTX2 обязателен | MeshOpt |
| VR | KTX2 обязателен | MeshOpt + LOD |
| Mini Program | KTX2 / WebP | MeshOpt / квантизация |
| Крупная сцена | KTX2 обязателен | MeshOpt + Draco + LOD |
Итоги серии
Шесть статей завершены; вместе они образуют полную цепочку:
- Почему так тяжело: фиксируем состав размера и правду о VRAM
- Три оружия сжатия вершин: принципы и выбор между квантизацией, MeshOpt, Draco
- Проблема текстур и VRAM: почему PNG/JPG виноваты глазами GPU
- KTX2 на практике: выбор ETC1S/UASTC, инструменты, загрузка в движок
- Руководство по выбору: рамка решений по платформам/сценариям
- Эта статья: полный конвейер от Blender до продакшена
Ключевая мысль в одном предложении: сначала определите узкое место (загрузка/VRAM/частота кадров), затем выбирайте инструменты; сжатие текстур даёт максимальную отдачу, сжатие вершин — добавка; разные платформы — разные судьбы, не применяйте единое правило для всех.
Следуя скрипту и шпаргалке этой статьи, путь от 50 МБ до 5 МБ и от 520 МБ VRAM до 70 МБ должен быть воспроизводимым. Осталось только сделать это.