Компрессированные текстуры используются для уменьшения объёма графических ресурсов и ускорения загрузки сцен. В отличие от обычных изображений формата PNG или JPEG, которые хранят пиксели в виде RGBA или RGB, компрессированные текстуры содержат данные в специализированных форматах, оптимизированных для видеокарты. Это снижает использование видеопамяти и повышает производительность рендеринга.
В современном веб-графическом контексте на основе WebGL2 и Three.js стандартом де-факто являются текстуры в формате KTX2 с кодированием Basis Universal.
Файл KTX2 (Khronos Texture 2) является контейнером, который может хранить текстуры в различных GPU-оптимизированных форматах, включая:
Формат KTX2 поддерживает несколько уровней MIP и различные варианты сжатия для разных платформ, что позволяет веб-приложениям автоматически выбирать оптимальный вариант под конкретное устройство.
Ключевые особенности KTX2:
Basis Universal — промежуточный формат для сжатия текстур. Он позволяет создавать текстуры, которые затем могут быть быстро перекодированы в формат, поддерживаемый конкретным GPU. В процессе подготовки текстуры в KTX2:
Преимущества Basis:
Three.js предоставляет KTX2Loader для загрузки и декодирования текстур KTX2. Основная последовательность действий:
import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';
import { MeshStandardMaterial, TextureLoader } from 'three';
const ktx2Loader = new KTX2Loader()
.setTranscoderPath('/basis/') // путь к wasm/decoder файлам
.detectSupport(renderer);
ktx2Loader.load('textures/wood.ktx2', function(texture) {
const material = new MeshStandardMaterial({ map: texture });
mesh.material = material;
});
Особенности работы KTX2Loader:
detectSupport(renderer) автоматически выбирает
GPU-оптимальный формат.Для эффективного использования KTX2 текстуры следует подготовить заранее:
.ktx2 и использовать их
напрямую в Three.js.Пример команды для конвертации:
basisu wood.png -ktx2 -mipmap -q 255
-ktx2 — выходной формат KTX2.-mipmap — генерация MIP-карт.-q 255 — максимальное качество сжатия.Использование KTX2 и Basis Universal значительно снижает потребление видеопамяти и ускоряет загрузку сцены. Рекомендации по оптимизации:
Three.js автоматически адаптирует KTX2 текстуры под аппаратные возможности устройства, что делает их оптимальным выбором для больших и детализированных сцен.
Текстуры в формате KTX2 прекрасно интегрируются с MeshStandardMaterial и другими PBR-материалами Three.js. Можно использовать:
map — базовая цветовая текстура.roughnessMap — карта шероховатости.metalnessMap — карта металлическости.normalMap — нормали для освещения.Каждая из этих текстур может быть закодирована в KTX2 и сжата через Basis, что позволяет одновременно экономить память и поддерживать высокое качество рендеринга.