Что на самом деле делает сжатие GLB?
Сжать GLB — значит перекодировать его текстуры и геометрию, чтобы та же модель занимала меньше байтов. Основную экономию дают текстуры: в восьми примерах моделей Khronos, которые мы измерили, изображения составляли основную часть каждого файла, где текстуры вообще были. Этот компрессор GLB уменьшает эти изображения, очищает геометрию и записывает новый .glb — всё в вашем браузере.
Уменьшенный GLB быстрее загружается на странице товара, укладывается в лимиты загрузки 3D-платформ и маркетплейсов и расходует меньше памяти на телефонах. Форму модели, её материалы и анимации ради этого менять не нужно.
На что уходят байты в GLB
В GLB хранятся три вида данных: текстуры (изображения, натянутые на модель), геометрия (позиции вершин, нормали и списки треугольников) и анимация. Текстуры лежат внутри GLB как полноценные файлы изображений, часто PNG 2048 × 2048, — поэтому модель всего из нескольких сотен треугольников может весить 8 МБ. Откройте файл в просмотрщике GLB, чтобы увидеть его разбивку до сжатия.
Очистка без потерь и сжатие с потерями
Некоторые шаги не меняют ничего видимого: удаление дублирующихся данных, неиспользуемых материалов и текстур, а также слияние полностью совпадающих вершин. Гораздо больше экономят шаги с потерями: уменьшение текстур, перекодирование их в WebP или JPEG и хранение позиций вершин с меньшим числом бит. «С потерями» не значит «заметно хуже», но именно эту часть стоит проверить — для этого и нужен переключатель «До / После».
Как сжать файл GLB за 3 шага
Перетащите .glb или .gltf
Нажмите «Выбрать 3D-файл» или перетащите .glb в окно просмотра. Для .gltf выберите его вместе с файлом .bin и текстурами или перетащите всю папку; на выходе всегда получается один .glb. На панели перечислены все текстуры с их размером, форматом и объёмом в байтах.
Выберите Web, «Совместимый» или «Свой»
Web даёт самый маленький файл для браузеров, «Совместимый» не добавляет в файл новых расширений, а «Свой» позволяет выбрать размер, формат и качество текстур. Таблица текстур показывает, во что превратится каждая текстура, ещё до того, как вы что-либо нажмёте.
Сравните и скачайте
Нажмите «Сжать GLB». Когда сжатие закончится, окно просмотра переключится на «После», а камера останется там, где вы её оставили; нажмите B или воспользуйтесь переключателем «До / После», чтобы сравнить, а затем скачайте сжатый .glb.
Выберите .glb или .gltf вместе с его файлами.
Выберите пресет в зависимости от того, куда модель пойдёт дальше.
Сравните «До» и «После», затем скачайте файл.
Текстуры: куда уходит большая часть байтов
Каждая текстура в GLB — это полноценный файл изображения, и когда модель выводится на экран, GPU распаковывает его в несжатые пиксели: текстура 2048 × 2048 занимает около 16 МБ видеопамяти без учёта мипмапов, каким бы маленьким ни был её PNG. Поэтому, когда вы сжимаете GLB, настройки текстур определяют и объём скачивания, и то, насколько тяжело модель отображать.
Размер текстур: 4096, 2048, 1024 или 512?
Если уменьшить ширину и высоту текстуры вдвое, останется четверть пикселей. На веб-странице, где модель обычно занимает часть экрана, для большинства товаров достаточно 1024 px; 2048 px стоит оставить для главных ракурсов и крупных планов, а 512 px подойдёт для мелких предметов. Этот компрессор GLB только уменьшает текстуры, никогда не увеличивает их и сохраняет пропорции. Чтобы вручную изменить размер отдельной текстуры, воспользуйтесь инструментом изменения размера изображений.
WebP, PNG или JPEG внутри GLB
PNG и JPEG входят в сам стандарт glTF, поэтому их читает любое приложение, которое открывает файлы GLB. WebP обычно даёт самые маленькие файлы, но GLB с такими текстурами объявляет расширение EXT_texture_webp, и приложение, которое его открывает, должно это расширение поддерживать. JPEG не хранит прозрачность, поэтому этот инструмент оставляет текстуру в PNG, если её пиксели не полностью непрозрачны. О компромиссах между форматами в целом читайте на странице PNG в WebP.
Картам нормалей нужно более бережное сжатие
Карта нормалей хранит в цветах направления поверхности, и блочные артефакты сжатия с потерями проявляются как ошибки освещения, а не как цветовой шум. Оба пресета задают для карт нормалей более высокий минимум качества (0,9). Кроме того, WebP и JPEG хранят цвет с пониженным разрешением, а это снижает точность карт нормалей и текстур, в которых шероховатость, металличность и затенение упакованы в отдельные каналы. Если эта точность важна, выберите «Свой» и сохраните исходный формат.
Текстуры с прозрачностью
Листья, декали и стекло часто опираются на альфа-канал. WebP его сохраняет, а JPEG не умеет, поэтому прозрачная текстура, которая должна была стать JPEG, сохраняется в PNG. В наших замерах у Lantern и ToyCar по этой причине одна-две текстуры остались в PNG.
Сжатие геометрии: meshopt, квантование и Draco
Обычно геометрия занимает меньшую часть GLB, но в плотных мешах, сканах и анимированных персонажах на неё может приходиться большая часть файла. Пресет Web сжимает её с помощью meshopt; остальные пресеты не меняют способ кодирования и только очищают её.
Что делает сжатие meshopt
Сначала meshopt переупорядочивает вершины и треугольники так, чтобы соседние данные лежали рядом, затем хранит позиции, нормали и текстурные координаты в виде небольших целых чисел вместо 32-битных чисел с плавающей точкой (квантование, объявляется как KHR_mesh_quantization) и, наконец, упаковывает результат с помощью EXT_meshopt_compression. В браузере такие данные декодируются очень быстро, и их читают three.js, model-viewer и Babylon.js.
Слияние вершин и удаление дубликатов
Экспортёры часто записывают одну и ту же вершину несколько раз, дублируют целые аксессоры или оставляют материалы и текстуры, которые нигде не используются. Слияние одинаковых вершин и удаление неиспользуемых данных проходят без потерь и выполняются в каждом пресете; одно это уменьшило небольшую модель Fox на 32%.
Почему у моделей с Draco геометрия не меняется
Draco — ещё одно расширение для сжатия геометрии, часто более плотное, чем meshopt. Чтобы снова записать Draco, нужен его кодировщик, а если декодировать геометрию и сохранить её без Draco, тестовый меш вырастал в 4–13 раз. Поэтому, если GLB уже использует Draco, этот инструмент перекодирует только текстуры, а все остальные байты, включая геометрию Draco, оставляет в точности такими, какими они были. Карточка результата сообщает, когда это произошло.
Какой пресет выбрать?
Прежде чем сжимать GLB, подумайте, куда модель пойдёт дальше: от этого зависит правильный пресет, потому что самые компактные настройки опираются на расширения glTF, которые читает не каждое приложение. В подсказке под пресетами перечислены расширения, которые добавят текущие настройки.
Для веб-просмотрщиков: three.js, model-viewer, Babylon.js
Выберите Web. Он уменьшает текстуры максимум до 1024 px, сохраняет их в WebP и сжимает геометрию с помощью meshopt. Браузерные просмотрщики и движки на основе three.js или Babylon.js читают все три расширения, которые он использует, а файлы получаются самыми маленькими из всего, что делает этот инструмент: на примерах Khronos — меньше на 48–98,8%.
Для Blender, Unity и настольных просмотрщиков
Выберите «Совместимый». Он сохраняет текстуры размером до 2048 px, записывает непрозрачные в JPEG, а прозрачные в PNG и вообще не добавляет расширений. Настольные программы и импортёры игровых движков поддерживают WebP и meshopt неравномерно, поэтому файл без них — надёжный выбор, когда вы не знаете, какая программа будет открывать его на другой стороне.
Когда выбирать «Свой»
Выберите «Свой», чтобы оставить текстуры в исходном размере, сохранить исходный формат для точных карт данных, повысить или понизить качество или отключить meshopt. Таблица текстур обновляется при каждом изменении настройки, так что вы видите, что произойдёт, ещё до сжатия.
Реальные результаты на примерах моделей Khronos
Чтобы понять, на что можно рассчитывать, мы сжали на этой странице файлы GLB из коллекции Khronos glTF Sample Assets: восемь оригиналов, в Chrome на настольном компьютере. С пресетом Web восемь файлов стали в среднем на 86% меньше, а по медиане — на 96%; самую большую экономию показал Avocado — с 7,73 МБ до 0,09 МБ, потому что три его текстуры PNG 2048 × 2048 составляли почти весь файл. На каждую модель ушло около секунды.
«Совместимый» экономит меньше, поскольку сохраняет текстуры в 2048 px и не использует WebP, но и он уменьшил четыре из восьми моделей на 83–93%. Меньше всего сэкономили модели с самой объёмной геометрией (в ToyCar около 109 000 треугольников) или с прозрачными текстурами, которые остаются в PNG.
Замеры: оригинал, Web и «Совместимый»
| Модель | Оригинал | Пресет Web | Пресет «Совместимый» |
|---|---|---|---|
| Avocado | 7,73 МБ | 0,09 МБ (−98,8%) | 0,57 МБ (−92,6%) |
| WaterBottle | 8,55 МБ | 0,12 МБ (−98,6%) | 0,88 МБ (−89,7%) |
| BoomBox | 10,12 МБ | 0,22 МБ (−97,8%) | 1,12 МБ (−89,0%) |
| Corset | 12,87 МБ | 0,51 МБ (−96,0%) | 2,15 МБ (−83,3%) |
| Lantern | 9,12 МБ | 0,36 МБ (−96,0%) | 5,49 МБ (−39,8%) |
| SheenChair | 3,93 МБ | 0,97 МБ (−75,3%) | 1,72 МБ (−56,3%) |
| ToyCar | 5,17 МБ | 1,30 МБ (−74,9%) | 3,92 МБ (−24,2%) |
| Fox | 0,16 МБ | 0,08 МБ (−48,0%) | 0,11 МБ (−31,9%) |
Не сломает ли сжатие мою модель?
Сжатие GLB меняет способ хранения данных, а не саму модель. Меши, материалы, имена узлов, анимации и другие возможности glTF переносятся без изменений; проверить стоит лишь расширения, которые требует новый файл, и то, как текстуры выглядят вблизи.
Расширения, которые может потребовать результат
Пресет Web может добавить EXT_texture_webp, EXT_meshopt_compression и KHR_mesh_quantization с пометкой «обязательное», чтобы приложение, которое не умеет их читать, сообщило об этом, а не показало сломанную модель. «Совместимый» не добавляет ни одного. Если GLB уже использовал другие расширения, они сохраняются; если инструмент не знает какое-то из них, он переходит к перекодированию одних только текстур, чтобы не переписывать то, чего не понимает.
Анимации, скины и цели морфинга
Анимации, персонажи со скиннингом и цели морфинга переживают сжатие. meshopt сжимает и ключевые кадры анимации, а квантование сохраняет достаточную точность для моделей обычного размера; в очень больших сценах или инженерных моделях, где размеры заданы в миллиметрах, сравните результат с включённым каркасом или отключите meshopt в пресете «Свой».
Текстуры KTX2 остаются как есть
Текстуры, которые уже хранятся в KTX2 (KHR_texture_basisu), сжаты для GPU и занимают мало видеопамяти. Этот инструмент оставляет их без изменений, а не превращает обратно в обычные изображения.
Почему GLB остаётся большим после сжатия
Если вы сжали GLB, а экономия оказалась небольшой, панель обычно показывает почему. Возможно, файл уже сжат: текстуры, которые и так являются небольшими изображениями WebP или JPEG, редко уменьшаются дальше, а инструмент оставляет исходную текстуру, если перекодирование не делает её меньше. Если результат вообще не получается меньше, скачивать нечего — так задумано.
Плотные сканы и фотограмметрия
Отсканированные объекты и модели из фотограмметрии часто содержат сотни тысяч или миллионы треугольников, и тогда файл заполняет геометрия, а не текстуры. meshopt помогает, но настоящее решение — меньше треугольников: упростите меш в 3D-редакторе, например модификатором Decimate в Blender, а затем сожмите результат здесь.
Сжатие .gltf с внешними файлами
Файл .gltf хранит геометрию и текстуры в отдельных файлах. Выберите их все или перетащите папку, и инструмент упакует всё в один сжатый .glb. Файл .gltf, использующий Draco, сначала нужно экспортировать в .glb, потому что данные Draco сохраняются без изменений только внутри GLB.
То же самое из командной строки
Эта страница запускает в вашем браузере открытую библиотеку glTF Transform. Если нужно сжимать много файлов в конвейере сборки, её консольная утилита делает похожую работу, например gltf-transform optimize input.glb output.glb --compress meshopt --texture-compress webp --texture-size 1024.
Ваша модель не покидает устройство
Многие онлайн-компрессоры GLB загружают файл на сервер, а некоторые ограничивают число файлов, которые можно сжать за неделю. Здесь вся работа идёт в фоновом потоке внутри вкладки браузера: модель читается с диска, сжимается в памяти и сразу сохраняется обратно как скачанный файл. Это важно для неопубликованных продуктов, клиентских проектов и всего, что подпадает под NDA. Закройте вкладку — и ничего не останется. Другие инструменты, которые работают так же, собраны на странице всех наших бесплатных инструментов.