Google и Binomial открыли код системы сжатия текстур Basis Universal

Компании Google и Binomial открыли исходные тексты Basis Universal, кодека для эффективного сжатия текстур и связанного с ним универсального файлового формата ».basis» для распространения текстур на базе изображений и видео. Код эталонной реализации написан на языке С++ и поставляется под лицензией Apache 2.0.

Basis Universal дополняет ранее опубликованную систему сжатия 3D-данных Draco и пытается решить проблему с поставкой текстур для GPU. До сих пор разработчики были ограничены выбором между низкоуровневыми форматами, позволяющими добиться высокой производительности, но специфичными для GPU и занимающими много места на диске, и другими форматами, которые позволяют добиться уменьшения размера, но не могут конкурировать с GPU-текстурами по производительности.

Формат Basis Universal позволяет добиться производительности уровня родных для GPU текстур, но обеспечивает более высокий уровень сжатия. Basis является промежуточным форматом, перед применением обеспечивающим быстрое перекодирование в различные низкоуровневые форматы текстур GPU, применяемых как на настольных системах, так и на мобильных устройствах. В настоящее время поддерживается трансляция в форматы PVRTC1 (4bpp RGB), BC7 (режим 6 RGB), BC1–5, ETC1, и ETC2. В дальнейшем ожидается поддержка формата ASTC (RGB или RGBA) и режимов 4/5 RGBA для формата BC7 и 4bpp RGBA для PVRTC1.

0_1558683129.png

Текстуры в формате basis занимают в 6–8 раз меньше видеопамяти и требует передачи примерно в два раза меньше данных, чем типовые текстуры на основе формата JPEG и на 10–25% меньше, чем текстуры в режиме RDO. Например, при размере JPEG-изображения в 891 Кб, а текстуры ETC1 в 1 Мб, размер данных в формате Basis составляет 469 Кб в режиме наивысшего качества. При размещении текстуры в видеопамяти, используемые в тестах текстуры в формате JPEG и PNG израсходовали 16 Мб памяти, в то время как для текстур в формате Basis потребовалось 2 Мб памяти в случае трансляции в BC1, PVRTC1 и ETC1, и 4 Мб в случае трансляции в BC7.

0_1558683745.png

Процесс перевода существующих приложений на Basis Universal достаточно прост. Достаточно перекодировать имеющиеся текстуры или изображения в новый формат при помощи предоставляемой проектом утилиты «basisu», выбрав необходимый уровень качества. Далее в приложении перед кодом отрисовки нужно инициализировать перекодировщик basisu, который отвечает за трансляцию промежуточного формата в поддерживаемый текущим GPU формат. При этом изображения на всей цепочке обработки остаются сжатыми, в том числе загружаются в сжатом виде в GPU. Вместо упреждающего перекодирования изображения целиком, GPU выборочно декодирует только необходимые части изображения.

Поддерживается сохранение в одном файле неоднородных массивов текстур (cubemap), объёмных текстур, массивов текстур, уровней mipmap, последовательностей видео или произвольных отрывков текстур. Например, возможна упаковка в одном файле серии изображений для создания небольших видео или объединение нескольких текстур с использованием общей для всех изображений палитры и дедупликацией типовых шаблонов изображений. Реализация кодировщика Basis Universal поддерживает многопоточное кодирование с использованием OpenMP. Перекодировщик пока работает только в однопоточном режиме.

Дополнительно доступен декодировщик Basis Universal для браузеров, поставляемый в формате WebAssembly, который можно использовать в web-приложениях на базе WebGL. В конечном счёте, Google намерен добиться поддержи Basis Universal во всех основных браузерах и продвинуть его в качестве переносимого формата текстур для WebGL и будущей спецификации WebGPU, концептуально схожей с API Vulkan, Metal и Direct3D 12.

Отмечается, что возможность встраивания видео с его последующей обработкой только на стороне GPU делает Basis Universal интересным решением для создания динамических интерфейсов пользователя на WebAssembly и WebGL, в которых могут одновременно отражаться сотни небольших видео с минимальной нагрузкой на CPU. До появления возможности использования инструкций SIMD в WebAssembly при традиционных кодеках подобный уровень производительности пока недостижим, поэтому видео на основе текстур может использоваться в областях, где обычное видео неприменимо. В настоящее время готовится к публикации код с дополнительными оптимизациями для видео, включающий возможность использования I-кадров и P-кадров с поддержкой адаптивного заполнения (CR).

©  OpenNet