Any3DAny3D
·Any3D Team

Из Blender в продакшен: полный обзор сжатия от начала до конца

3d-compressionpipelinetexture-compressionvertex-compressiongltf

На данном этапе серии инструменты, принципы и критерии выбора уже рассмотрены. В этой финальной статье мы соберём всё в рабочий конвейер: начиная с реальной модели 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Изменение
Шаг 145 МБ~520 МБ
Шаг 2 + MeshOpt30 МБ~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Изменение
Шаг 230 МБ~520 МБ
Шаг 3 + KTX26 МБ~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Изменение
Шаг 36 МБ~70 МБ
Шаг 4 + simplify 0.54.5 МБ~70 МБ-1.5 МБ (VRAM примерно без изменений)

Упрощение в основном экономит размер файла; воздействие на VRAM мало. Цена — уменьшение детализации модели; видно при приближении. Страницы товаров в e-commerce обычно не стоит чрезмерно упрощать; здания/крупные сцены — отличный вариант.

Полная таблица отслеживания эффекта

Сложим четыре шага для полной картины (на основе приведённого примера; цифры иллюстративны по масштабу):

ШагРазмер файлаVRAMСовокупное уменьшение
Базовый уровень (float32 + PNG)50 МБ~520 МБ
+ дедупликация и сварка45 МБ~520 МБ-10%
+ вершины MeshOpt30 МБ~520 МБ-40%
+ текстуры KTX26 МБ~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 / KTX2MeshOpt
Мобильный вебKTX2 обязателенMeshOpt
VRKTX2 обязателенMeshOpt + LOD
Mini ProgramKTX2 / WebPMeshOpt / квантизация
Крупная сценаKTX2 обязателенMeshOpt + Draco + LOD

Итоги серии

Шесть статей завершены; вместе они образуют полную цепочку:

  1. Почему так тяжело: фиксируем состав размера и правду о VRAM
  2. Три оружия сжатия вершин: принципы и выбор между квантизацией, MeshOpt, Draco
  3. Проблема текстур и VRAM: почему PNG/JPG виноваты глазами GPU
  4. KTX2 на практике: выбор ETC1S/UASTC, инструменты, загрузка в движок
  5. Руководство по выбору: рамка решений по платформам/сценариям
  6. Эта статья: полный конвейер от Blender до продакшена

Ключевая мысль в одном предложении: сначала определите узкое место (загрузка/VRAM/частота кадров), затем выбирайте инструменты; сжатие текстур даёт максимальную отдачу, сжатие вершин — добавка; разные платформы — разные судьбы, не применяйте единое правило для всех.

Следуя скрипту и шпаргалке этой статьи, путь от 50 МБ до 5 МБ и от 520 МБ VRAM до 70 МБ должен быть воспроизводимым. Осталось только сделать это.

Поддержите нас