Текстуры занимают наибольшую долю видеопамяти в большинстве трёхмерных приложений. Высокое разрешение материалов, карты нормалей, карты освещения, окружения и отражений быстро увеличивают объём данных, которые должны быть загружены, переданы в GPU и сохранены в видеопамяти. Без компрессии это приводит к нескольким проблемам:
Компрессия текстур позволяет уменьшить размер данных на диске, в оперативной памяти и в видеопамяти. При этом декомпрессия часто выполняется непосредственно на GPU аппаратными блоками, что практически не влияет на производительность рендеринга.
В среде WebGL поддержка различных форматов аппаратной компрессии зависит от платформы и графического процессора. Встречаются следующие форматы:
Различия между устройствами усложняют распространение одного универсального формата. Решением этой проблемы стала технология Basis Universal, используемая в контейнере KTX2.
KTX2 (Khronos Texture 2) — стандартный контейнерный формат для хранения текстур, разработанный организацией Khronos Group. Формат предназначен для эффективной передачи и хранения GPU-совместимых текстур.
KTX2 выполняет несколько задач:
KTX2 используется в современных графических пайплайнах WebGL и WebGPU. Его основное преимущество — способность содержать данные Basis Universal, которые могут быть перекодированы в формат, поддерживаемый конкретным устройством.
Basis Universal — система универсальной компрессии текстур, разработанная Binomial LLC. Она предназначена для создания одного текстурного файла, который может быть перекодирован в разные GPU-форматы.
Основные особенности технологии:
Basis Universal использует два режима компрессии:
| Режим | Назначение |
|---|---|
| ETC1S | максимальное сжатие |
| UASTC | высокое качество |
Эти режимы отличаются балансом между размером файла и качеством изображения.
ETC1S — режим, оптимизированный для минимального размера файлов. Он использует дополнительную энтропийную компрессию, что позволяет добиться очень высокого коэффициента сжатия.
Характеристики:
Недостаток заключается в возможных артефактах при высокой детализации.
Чаще всего ETC1S используется для:
UASTC (Universal Adaptive Scalable Texture Compression) — режим компрессии, ориентированный на качество.
Характеристики:
UASTC часто применяется для:
Использование KTX2 с Basis Universal обеспечивает несколько ключевых преимуществ.
Уменьшение размера загрузки
Размер текстур может уменьшаться в 6–10 раз по сравнению с PNG или JPEG.
Универсальность
Один файл может быть перекодирован в разные GPU-форматы:
Экономия видеопамяти
Компрессированные текстуры занимают значительно меньше VRAM.
Сокращение времени загрузки
Меньший объём данных ускоряет загрузку сцен и моделей.
Оптимизация мобильных устройств
Мобильные GPU особенно выигрывают от аппаратной компрессии.
Babylon.js содержит встроенную систему декодирования KTX2 и Basis Universal. Для работы используется специальный Basis transcoder, который выполняет перекодирование текстуры в поддерживаемый GPU-формат.
Процесс загрузки текстуры выглядит следующим образом:
Babylon.js автоматически выбирает оптимальный формат для конкретного устройства.
Поддерживаемые GPU-форматы могут включать:
Для работы с 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 можно загружать так же, как обычные текстуры.
const texture = new BABYLON.Texture(
"textures/wood.ktx2",
scene
);
Babylon.js самостоятельно определяет формат файла и применяет соответствующий декодер.
KTX2-текстуры можно использовать в стандартных материалах Babylon.js.
const material = new BABYLON.StandardMaterial("mat", scene);
material.diffuseTexture = new BABYLON.Texture(
"textures/brick.ktx2",
scene
);
Такие текстуры полностью совместимы со всеми свойствами материалов:
Формат 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);
Компрессия позволяет значительно снизить объём памяти при использовании комплексных материалов.
Формат glTF поддерживает расширение:
KHR_texture_basisu
Это расширение позволяет хранить текстуры модели в формате KTX2.
Babylon.js полностью поддерживает такие модели. При загрузке glTF сцены текстуры автоматически декодируются.
BABYLON.SceneLoader.Append(
"models/",
"scene.glb",
scene
);
Если внутри модели присутствуют KTX2-текстуры, Babylon.js применяет Basis transcoder.
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 обеспечивает лучший баланс между размером файла, качеством и совместимостью.
Для конвертации используется инструмент 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
При конвертации также можно:
Использование KTX2 оказывает значительное влияние на эффективность WebGL-приложений.
Преимущества:
Накладные расходы:
В большинстве случаев выигрыш значительно превышает накладные расходы.
При использовании KTX2 рекомендуется придерживаться следующих правил:
1. ETC1S для большинства текстур
Этот режим обеспечивает максимальное сжатие.
2. UASTC для карт нормалей
Карты нормалей чувствительны к искажениям.
3. Использование mip-уровней
Они уменьшают aliasing и повышают производительность.
4. Проверка качества
Некоторые текстуры могут требовать более высокого качества компрессии.
5. Использование в glTF
Хранение KTX2 внутри моделей уменьшает число сетевых запросов.
Процесс работы декодера Basis внутри Babylon.js включает несколько этапов.
1. Загрузка бинарных данных
Файл KTX2 загружается через систему ресурсов движка.
2. Разбор контейнера
KTX2-парсер извлекает:
3. Transcoding
Basis transcoder выбирает формат GPU.
4. Передача в WebGL
Данные отправляются в видеопамять через
compressedTexImage2D.
Эта архитектура позволяет эффективно использовать аппаратную компрессию на различных устройствах.
Несмотря на преимущества, технология имеет ряд особенностей.
Поддержка WebAssembly
Transcoder Basis использует WebAssembly для высокой производительности.
Первичная инициализация
Первый запуск декодера может занимать несколько десятков миллисекунд.
Размер декодера
Файлы transcoder-модулей добавляют небольшой вес к приложению.
Однако эти ограничения незначительны по сравнению с преимуществами компрпрессии текстур.
Использование KTX2 с Basis Universal стало стандартной практикой в современных 3D-движках. Формат решает ключевые проблемы распространения графических ресурсов в веб-среде:
Благодаря встроенной поддержке Babylon.js интеграция KTX2-текстур требует минимальных усилий, обеспечивая значительное повышение эффективности работы графических приложений.