Компрессия текстур: KTX2, Basis Universal

Текстуры занимают наибольшую долю видеопамяти в большинстве трёхмерных приложений. Высокое разрешение материалов, карты нормалей, карты освещения, окружения и отражений быстро увеличивают объём данных, которые должны быть загружены, переданы в GPU и сохранены в видеопамяти. Без компрессии это приводит к нескольким проблемам:

  • длительная загрузка ресурсов;
  • высокое потребление памяти;
  • увеличение времени передачи данных в GPU;
  • снижение производительности на мобильных устройствах.

Компрессия текстур позволяет уменьшить размер данных на диске, в оперативной памяти и в видеопамяти. При этом декомпрессия часто выполняется непосредственно на GPU аппаратными блоками, что практически не влияет на производительность рендеринга.

В среде WebGL поддержка различных форматов аппаратной компрессии зависит от платформы и графического процессора. Встречаются следующие форматы:

  • S3TC / DXT
  • ETC1 / ETC2
  • PVRTC
  • ASTC

Различия между устройствами усложняют распространение одного универсального формата. Решением этой проблемы стала технология Basis Universal, используемая в контейнере KTX2.


Контейнер KTX2

KTX2 (Khronos Texture 2) — стандартный контейнерный формат для хранения текстур, разработанный организацией Khronos Group. Формат предназначен для эффективной передачи и хранения GPU-совместимых текстур.

KTX2 выполняет несколько задач:

  • хранение данных текстуры в сжатом виде;
  • поддержка различных схем компрессии;
  • хранение метаданных;
  • хранение mip-уровней;
  • возможность перекодирования текстуры в разные GPU-форматы.

KTX2 используется в современных графических пайплайнах WebGL и WebGPU. Его основное преимущество — способность содержать данные Basis Universal, которые могут быть перекодированы в формат, поддерживаемый конкретным устройством.


Basis Universal

Basis Universal — система универсальной компрессии текстур, разработанная Binomial LLC. Она предназначена для создания одного текстурного файла, который может быть перекодирован в разные GPU-форматы.

Основные особенности технологии:

  • высокая степень сжатия;
  • возможность перекодирования в GPU-форматы в момент загрузки;
  • уменьшение объёма загружаемых данных;
  • поддержка различных платформ.

Basis Universal использует два режима компрессии:

Режим Назначение
ETC1S максимальное сжатие
UASTC высокое качество

Эти режимы отличаются балансом между размером файла и качеством изображения.


ETC1S

ETC1S — режим, оптимизированный для минимального размера файлов. Он использует дополнительную энтропийную компрессию, что позволяет добиться очень высокого коэффициента сжатия.

Характеристики:

  • очень маленький размер файла;
  • быстрая загрузка;
  • умеренное качество изображения;
  • подходит для большинства игровых текстур.

Недостаток заключается в возможных артефактах при высокой детализации.

Чаще всего ETC1S используется для:

  • диффузных текстур;
  • текстур окружения;
  • второстепенных материалов.

UASTC

UASTC (Universal Adaptive Scalable Texture Compression) — режим компрессии, ориентированный на качество.

Характеристики:

  • значительно более высокое качество;
  • большее сходство с исходной текстурой;
  • более крупный размер файла;
  • быстрая перекодировка.

UASTC часто применяется для:

  • карт нормалей;
  • текстур с высокой детализацией;
  • UI-элементов;
  • материалов, чувствительных к артефактам.

Преимущества использования KTX2 и Basis

Использование KTX2 с Basis Universal обеспечивает несколько ключевых преимуществ.

Уменьшение размера загрузки

Размер текстур может уменьшаться в 6–10 раз по сравнению с PNG или JPEG.

Универсальность

Один файл может быть перекодирован в разные GPU-форматы:

  • ASTC
  • ETC2
  • BC7
  • PVRTC

Экономия видеопамяти

Компрессированные текстуры занимают значительно меньше VRAM.

Сокращение времени загрузки

Меньший объём данных ускоряет загрузку сцен и моделей.

Оптимизация мобильных устройств

Мобильные GPU особенно выигрывают от аппаратной компрессии.


Поддержка KTX2 в Babylon.js

Babylon.js содержит встроенную систему декодирования KTX2 и Basis Universal. Для работы используется специальный Basis transcoder, который выполняет перекодирование текстуры в поддерживаемый GPU-формат.

Процесс загрузки текстуры выглядит следующим образом:

  1. загрузка файла KTX2;
  2. декомпрессия Basis-данных;
  3. перекодирование в GPU-формат;
  4. загрузка в видеопамять.

Babylon.js автоматически выбирает оптимальный формат для конкретного устройства.

Поддерживаемые GPU-форматы могут включать:

  • BC1 / BC3 (desktop GPU)
  • ETC2 (Android)
  • ASTC (современные мобильные GPU)
  • PVRTC (iOS)

Подключение KTX2-декодера

Для работы с KTX2 необходимо подключить transcoder Basis.

Babylon.js позволяет указать путь к декодеру:

BABYLON.KhronosTextureContainer2.URLConfig = {
    jsDecoderModule: "basis/basis_transcoder.js",
    wasmUASTCToASTC: "basis/uastc_astc.wasm",
    wasmUASTCToBC7: "basis/uastc_bc7.wasm",
    wasmUASTCToRGBA32: "basis/uastc_rgba32.wasm",
};

После подключения Babylon.js автоматически использует декодер при загрузке KTX2-файлов.


Загрузка KTX2-текстуры

Текстуры в формате KTX2 можно загружать так же, как обычные текстуры.

const texture = new BABYLON.Texture(
    "textures/wood.ktx2",
    scene
);

Babylon.js самостоятельно определяет формат файла и применяет соответствующий декодер.


Использование KTX2 в материалах

KTX2-текстуры можно использовать в стандартных материалах Babylon.js.

const material = new BABYLON.StandardMaterial("mat", scene);

material.diffuseTexture = new BABYLON.Texture(
    "textures/brick.ktx2",
    scene
);

Такие текстуры полностью совместимы со всеми свойствами материалов:

  • diffuse
  • normal
  • roughness
  • metallic
  • emissive

Использование в PBR-материалах

Формат KTX2 особенно эффективен в физически корректных материалах PBR, где используется большое количество текстур.

const pbr = new BABYLON.PBRMaterial("pbr", scene);

pbr.albedoTexture = new BABYLON.Texture("textures/albedo.ktx2", scene);
pbr.normalTexture = new BABYLON.Texture("textures/normal.ktx2", scene);
pbr.metallicTexture = new BABYLON.Texture("textures/metallic.ktx2", scene);

Компрессия позволяет значительно снизить объём памяти при использовании комплексных материалов.


KTX2 в формате glTF

Формат glTF поддерживает расширение:

KHR_texture_basisu

Это расширение позволяет хранить текстуры модели в формате KTX2.

Babylon.js полностью поддерживает такие модели. При загрузке glTF сцены текстуры автоматически декодируются.

BABYLON.SceneLoader.Append(
    "models/",
    "scene.glb",
    scene
);

Если внутри модели присутствуют KTX2-текстуры, Babylon.js применяет Basis transcoder.


Генерация mip-уровней

Mip-карты — это уменьшенные копии текстуры, используемые при удалении объекта от камеры.

KTX2 может хранить mip-уровни внутри файла. Это ускоряет загрузку и снижает нагрузку на GPU.

Структура файла:

Texture
 ├─ mip 0 (1024x1024)
 ├─ mip 1 (512x512)
 ├─ mip 2 (256x256)
 ├─ mip 3 (128x128)
 └─ ...

Babylon.js автоматически использует эти уровни.


Сравнение форматов текстур

Формат Размер GPU-компрессия Универсальность
PNG большой нет высокая
JPEG средний нет высокая
DDS средний да ограниченная
KTX2 + Basis маленький да высокая

KTX2 обеспечивает лучший баланс между размером файла, качеством и совместимостью.


Конвертация текстур в KTX2

Для конвертации используется инструмент toktx из пакета KTX-Software.

Пример:

toktx --bcmp --genmipmap texture.ktx2 texture.png

Для режима ETC1S:

toktx --t2 --bcmp texture.ktx2 texture.png

Для режима UASTC:

toktx --t2 --uastc texture.ktx2 texture.png

При конвертации также можно:

  • генерировать mip-уровни;
  • выбирать качество компрессии;
  • оптимизировать альфа-канал.

Влияние на производительность

Использование KTX2 оказывает значительное влияние на эффективность WebGL-приложений.

Преимущества:

  • уменьшение размера загрузки;
  • снижение времени инициализации сцены;
  • уменьшение потребления VRAM;
  • улучшение производительности мобильных устройств.

Накладные расходы:

  • небольшое время перекодирования Basis;
  • необходимость загрузки transcoder-модуля.

В большинстве случаев выигрыш значительно превышает накладные расходы.


Практические рекомендации

При использовании KTX2 рекомендуется придерживаться следующих правил:

1. ETC1S для большинства текстур

Этот режим обеспечивает максимальное сжатие.

2. UASTC для карт нормалей

Карты нормалей чувствительны к искажениям.

3. Использование mip-уровней

Они уменьшают aliasing и повышают производительность.

4. Проверка качества

Некоторые текстуры могут требовать более высокого качества компрессии.

5. Использование в glTF

Хранение KTX2 внутри моделей уменьшает число сетевых запросов.


Архитектура декодирования в Babylon.js

Процесс работы декодера Basis внутри Babylon.js включает несколько этапов.

1. Загрузка бинарных данных

Файл KTX2 загружается через систему ресурсов движка.

2. Разбор контейнера

KTX2-парсер извлекает:

  • mip-уровни
  • метаданные
  • Basis-данные

3. Transcoding

Basis transcoder выбирает формат GPU.

4. Передача в WebGL

Данные отправляются в видеопамять через compressedTexImage2D.

Эта архитектура позволяет эффективно использовать аппаратную компрессию на различных устройствах.


Ограничения и особенности

Несмотря на преимущества, технология имеет ряд особенностей.

Поддержка WebAssembly

Transcoder Basis использует WebAssembly для высокой производительности.

Первичная инициализация

Первый запуск декодера может занимать несколько десятков миллисекунд.

Размер декодера

Файлы transcoder-модулей добавляют небольшой вес к приложению.

Однако эти ограничения незначительны по сравнению с преимуществами компрпрессии текстур.


Значение KTX2 для современных WebGL-приложений

Использование KTX2 с Basis Universal стало стандартной практикой в современных 3D-движках. Формат решает ключевые проблемы распространения графических ресурсов в веб-среде:

  • различия GPU-форматов;
  • большие размеры текстур;
  • ограничения мобильных устройств;
  • время загрузки приложений.

Благодаря встроенной поддержке Babylon.js интеграция KTX2-текстур требует минимальных усилий, обеспечивая значительное повышение эффективности работы графических приложений.