
9 декабря 2025 года разработчик Arseny Kapoulkine (zeux) представил первый мажорный выпуск открытой библиотеки meshoptimizer 1.0. Исходный код проекта написан на C++ и JavaScript и опубликован на GitHub под лицензией MIT. Решение находится в разработке с 2017 года. Большая часть работы над основной библиотекой в этом релизе была спонсирована Valve.
Когда графический процессор (GPU) рендерит треугольные меши (triangle mesh), различные этапы конвейера GPU должны обрабатывать данные вершин и индексов. Эффективность этих этапов зависит от данных, которые передаются для обработки. Библиотека meshoptimizer предоставляет алгоритмы для оптимизации мешей на этих этапах, а также алгоритмы для уменьшения сложности мешей и накладных расходов на хранение.
Вместе с библиотекой meshoptimizer разрабатываются и два сопутствующих проекта: gltfpack, инструмент командной строки, который автоматически оптимизирует файлы glTF, и clusterlod.h, библиотека C/C++ для непрерывного уровня детализации с использованием кластерного упрощения.
«В этом релизе основное внимание уделяется улучшению алгоритмов кластеризации, упрощения и разбиения, а также стабилизации — за исключением разрешительного режима упрощения, вся остальная функциональность библиотеки, представленная в предыдущих релизах, теперь считается стабильной.
Алгоритмы кластеризации (meshopt_buildMeshlets/meshopt_buildMeshletsFlex, meshopt_buildMeshletsSpatial) теперь работают быстрее и, в случае пространственной кластеризации, создают кластеры более высокого качества для мешлетов с привязкой к вершинам.
Говоря об иерархической кластеризации, следует отметить, что разработана и поддерживается новая библиотека clusterlod.h, работающая параллельно с meshoptimizer. Эта библиотека реализует непрерывный уровень детализации, генерируя иерархию кластеров, которые постепенно группируются и упрощаются, подобно Nanite. Она использует алгоритмы meshoptimizer для внутренней обработки и может использоваться как в исходном виде, так и в качестве отправной точки для реализации собственного решения — код структурирован таким образом, чтобы его было легко понять и модифицировать.
Новые функции упрощения, добавленные в последнем релизе, также получили дальнейшее улучшение качества; как meshopt_simplifyWithUpdate, так и опция meshopt_SimplifyPermissive теперь генерируют более качественные выходные данные. Опция разрешительного режима по‑прежнему считается экспериментальной, и в будущих релизах её поведение может быть улучшено или изменено.
Все остальные экспериментальные функции и опции библиотеки переведены в стабильный статус. Это означает, что будущие релизы будут совместимы с API (код продолжит компилироваться), ABI (код сможет связываться с общей библиотекой meshoptimizer, которую затем можно будет обновлять независимо) и поведением (результаты могут улучшиться в будущих релизах, но эти улучшения не должны требовать изменений в вызывающем коде) в отношении текущей функциональности версии 1.0.
Функции кодирования вершин (meshopt_encodeVertexBuffer/meshopt_encodeVertexBufferLevel) теперь по умолчанию кодируют данные v1. Это можно переопределить для приложений, которым необходимо создавать данные в формате v0, особенно если данные создаются для расширения EXT_meshopt_compression, которое поддерживает только v0. Эта версия только изменяет кодировку по умолчанию; поддержка кодирования и декодирования v0/v1 будет предоставляться постоянно.
Теперь gltfpack поддерживает новое расширение KHR_meshopt_compression через опцию ‑cz (или ‑ce khr, которая позволяет независимо указывать уровень сжатия; ‑cz эквивалентно ‑ce khr ‑cc), обеспечивающее лучшее сжатие по сравнению с существующим расширением EXT_meshopt_compression. Обратите внимание, что поддержка этого расширения загрузчиками пока не получила широкого распространения, и по умолчанию gltfpack продолжает использовать EXT_meshopt_compression при запросе сжатия.
Наконец, привязки JavaScript были обновлены для использования модулей ES вместо модулей CommonJS, что может потребовать корректировки путей импорта. Для модуля MeshoptDecoder по‑прежнему предоставляется вариант CommonJS meshopt_decoder.cjs для совместимости (но обратите внимание на другое расширение файла, необходимое для корректной обработки некоторыми сборщиками)»,
— пояснил разработчик проекта.
