Компании Google и Binomial открыли (https://opensource.googleblog.com/2019/05/google-and-binomia...) исходные тексты Basis Universal (https://github.com/binomialLLC/basis_universal), кодека для эффективного сжатия текстур и связанного с ним универсального файлового формата ".basis" для распространения текстур на базе изображений и видео. Код эталонной реализации написан на языке С++ и поставляется (https://github.com/binomialLLC/basis_universal) под лицензией Apache 2.0. Basis Universal дополняет ранее опубликованную (https://www.opennet.dev/opennews/art.shtml?num=45853) систему сжатия 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.
Текстуры в формате basis занимают в 6-8 раз меньше видеопамяти и требует передачи примерно в два раза меньше данных, чем типовые текстуры на основе формата JPEG и на 10-25% меньше, чем текстуры в режиме RDO. Например, при размере JPEG-изображения в 891 Кб, а текстуры ETC1 в 1 Мб, размер данных в формате Basis составляет 469 Кб в режиме наивысшего качества. При размещении текстуры в видеопамяти, используемые в тестах текстуры в формате JPEG и PNG израсходовали 16 Мб памяти, в то время как для текстур в формате
Basis потребовалось 2 Мб памяти в случае трансляции в BC1, PVRTC1 и ETC1, и 4 Мб в случае трансляции в BC7.
Процесс перевода существующих приложений на Basis Universal достаточно прост. Достаточно перекодировать имеющиеся текстуры или изображения в новый формат при помощи предоставляемой проектом утилиты "basisu", выбрав необходимый уровень качества. Далее в приложении перед кодом отрисовки нужно инициализировать перекодировщик basisu, который отвечает за трансляцию промежуточного формата в поддерживаемый текущим GPU формат. При этом изображения на всей цепочке обработки остаются сжатыми, в том числе загружаются в сжатом виде в GPU. Вместо упреждающего перекодирования изображения целиком, GPU выборочно декодирует только необходимые части изображения.
Поддерживается сохранение в одном файле неоднородных массивов текстур (cubemap), объёмных текстур, массивов текстур, уровней mipmap, последовательностей видео или произвольных отрывков текстур. Например, возможна упаковка в одном файле серии изображений для создания небольших видео или объединение нескольких текстур с использованием общей для всех изображений палитры и дедупликацией типовых шаблонов изображений. Реализация кодировщика Basis Universal поддерживает многопоточное кодирование с использованием OpenMP. Перекодировщик пока работает только в однопоточном режиме.
Дополнительно доступен (https://github.com/BinomialLLC/basis_universal/blob/master/w...) декодировщик Basis Universal для браузеров, поставляемый в формате WebAssembly, который можно использовать в web-приложениях на базе WebGL. В конечном счёте, Google намерен добиться поддержи Basis Universal во всех основных браузерах и продвинуть его в качестве переносимого формата текстур для WebGL и будущей спецификации WebGPU (https://en.wikipedia.org/wiki/WebGPU), концептуально схожей с API Vulkan, Metal и Direct3D 12.
Отмечается, что возможность встраивания видео с его последующей обработкой только на стороне GPU делает Basis Universal интересным решением для создания динамических интерфейсов пользователя на WebAssembly и WebGL, в которых могут одновременно отражаться сотни небольших видео с минимальной нагрузкой на CPU. До появления возможности использования инструкций SIMD в WebAssembly при традиционных кодеках подобный уровень производительности пока недостижим, поэтому видео на основе текстур может использоваться в областях, где обычное видео неприменимо. В настоящее время готовится к публикации код с дополнительными оптимизациями для видео, включающий возможность использования I-кадров и P-кадров (https://ru.wikipedia.org/wiki/%D0%A2%D0%...) с поддержкой адаптивного заполнения (CR).
URL: https://opensource.googleblog.com/2019/05/google-and-binomia...
Новость: https://www.opennet.dev/opennews/art.shtml?num=50732