Пост

Ktx 2 Basis Universal Textures Developer Guide

Вольный перевод поста Khronos Group "KTX 2.0 / Basis Universal Textures — Developer Guide"

Ktx 2 Basis Universal Textures Developer Guide

Пост не является авторским и/или официальным.
Более того - он так же не является профессиональным.

Автор оригинала: Khronos Group
Ссылка на оригинал: KTX 2.0 / Basis Universal Textures — Developer Guide

Формат Контейнера KTX

При реализации поддержки сжатых текстур разработчикам следует различать три концептуальных формата:

  1. Формат контейнера: Пояснительная обёртка вокруг данных формата передачи. Описывает размеры изображения, типы сжатия и способ доступа к данным и их транскодирования в пиксельный формат, поддерживаемый GPU. Без формата контейнера сжатые данные нельзя корректно переносить между приложениями.
    • Примеры: KTX 2.0
  2. Формат передачи: Сильно сжатое представление пиксельных данных в разметке, рассчитанной на эффективное транскодирование в один или несколько форматов сжатия GPU.
    • Примеры: ETC1S и UASTC
  3. Сжатый пиксельный формат GPU: Сжатое представление пиксельных данных, которое понимает GPU.
    • Примеры: BCn, ASTC, ETC и PVRTC1

Портативные 3D-модели glTF 2.0 могут использовать сжатые текстуры, хранящиеся в формате контейнера KTX 2.0 (.ktx2), как описано в расширении glTF KHR_texture_basisu. KTX 2.0 — относительно простой бинарный формат; его можно читать и записывать без готовых библиотек, ориентируясь на спецификацию. Доступны несколько реализаций:

  • KTX-Software: Официальные библиотеки C/C++ для чтения, записи и транскодирования KTX-файлов, с опциональной поддержкой создания текстур в различных графических API. Включает готовые бинарные пакеты и сборки WebAssembly.
  • Basis Universal: Библиотеки Binomial на C/C++ для записи и транскодирования KTX-файлов с текстурами формата BasisU. Включает сборки WebAssembly.
  • KTX-Parse: Легковесная JavaScript/TypeScript/Node.js библиотека для чтения и записи KTX-файлов. Транскодирование в сжатый формат GPU нужно реализовывать отдельно1.

Блочное сжатие

Для поддержки произвольного доступа сжатые текстуры обычно организуют в блоки одного размера. Basis Universal всегда использует блоки 4x4 пикселя.

Для вычисления количества блоков для заданной текстуры (например, для оценки необходимого объема памяти GPU) приложениям следует использовать следующие выражения:

1
2
3
4
WIDTH_IN_BLOCKS = (WIDTH_IN_PIXELS + 3) >> 2;
HEIGHT_IN_BLOCKS = (HEIGHT_IN_PIXELS + 3) >> 2;

BLOCK_COUNT = WIDTH_IN_BLOCKS * HEIGHT_IN_BLOCKS;

Приложения должны ожидать, что размеры базового уровня mip будут равны 1, 2 или кратны 4. Входные данные, не соответствующие этому ограничению, являются недействительными и должны быть отклонены.

Размеры следующих уровней mip определяются по стандартному правилу целочисленного деления на 2. Например:

Уровень MipШирина x Высота, pxШирина x Высота, блоки
0100 x 20025 x 50
150 x 10013 x 25
225 x 507 x 13
312 x 253 x 7
46 x 122 x 3
53 x 61 x 2
61 x 31 x 1
71 x 11 x 1

Здесь базовый уровень mip полностью заполняет сжатые блоки размером 25 x 50. У следующих уровней часть пикселей в блоках остаётся заполненной дополнением (padding). Это дополнение (если оно присутствует) не влияет на обертывание текстурных координат и недоступно при сэмплинге.

Некоторые старые платформы (например, WebGL 1.0) могут требовать, чтобы все текстуры имели размеры, кратные степени двойки. В таком случае приложениям не остается ничего другого, кроме как распаковывать и масштабировать текстуры, размеры которых не являются кратными степени двойки, тем самым теряя все преимущества сжатия текстур на GPU.

Кодек ETC1S / BasisLZ

Обзор

ETC1S / BasisLZ — это гибридная схема сжатия, в которой данные текстурных блоков ETC1S переупорядочиваются и сжимаются без потерь в стиле LZ. Высокая эффективность хранения / передачи достигается за счёт приоритета информации о яркости. Таким образом, этот кодек лучше подходит для цветовых текстур (альбедо, базовый цвет и т.п.), чем для произвольных нецветовых данных, таких как карты нормалей.

После декодирования LZ-сжатия данные ETC1S можно без потерь переупаковать в обычные текстурные блоки ETC1 или транскодировать в другие блочно-сжатые форматы GPU.

Формат данных

ETC1S представляет собой подмножество ETC1, поэтому сжатые данные всегда имеют три цветовых канала. Для поддержки сценариев использования, отличных от непрозрачных цветовых текстур, сжатые данные могут содержать дополнительный “срез” (slice) ETC1S.

Дескриптор формата данных ETC1S в контейнерном формате KTX v2 может содержать одну или две записи channelType.

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

КаналыПервый срезВторой срезТипичное применение
RGBKHR_DF_CHANNEL_ETC1S_RGBОтсутствуетНепрозрачная цветовая текстура
RGBAKHR_DF_CHANNEL_ETC1S_RGBKHR_DF_CHANNEL_ETC1S_AAAЦветовая текстура с альфа-каналом
RedKHR_DF_CHANNEL_ETC1S_RRRОтсутствуетОдноканальная текстура
Red-GreenKHR_DF_CHANNEL_ETC1S_RRRKHR_DF_CHANNEL_ETC1S_GGGДвухканальная текстура

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

Использование данных ETC1S / BasisLZ включает в себя три шага:

  1. Инициализация транскодера общими для всех срезов текстуры данными (грани, элементы массива, уровни mip и т.д.).

    Примечание. В контейнере KTX v2 такие данные хранятся в блоке supercompressionGlobalData. Подробнее: разделы BasisLZ Global Data и BasisLZ Bitstream Specification.

  2. Вызов декодера с данными по каждому срезу и нужным целевым форматом текстуры. Приложения должны выбирать целевой формат в зависимости от возможностей платформы и предполагаемого использования.

  3. Загрузка транскодированных данных в GPU.

Когда в текстурных данных используется нелинейное кодирование sRGB (практически все цветные текстуры используют его), приложениям следует использовать аппаратный sRGB-декодер для достижения корректной фильтрации. Это может быть легко достигнуто загрузкой сжатых данных с соответствующим значением формата текстуры (см. ниже).

Примечание. Одноканальные (Red) и двухканальные (Red-Green) текстуры не поддерживают sRGB-кодирование.

Выбор цели транскодирования (RGB и RGBA)

  • По замыслу ETC1S — это строгое подмножество ETC1, поэтому всегда предпочтительно транскодировать его в форматы ETC. Текстуры с одним срезом — в ETC1 RGB, с двумя срезами — в ETC2 RGBA.

    Примечание. ETC1 RGB является строгим подмножеством ETC2 RGB.

    Примечание. На платформах, которые поддерживают только ETC1 каждый срез ETC1S можно транскодировать в отдельную текстуру ETC1 и использовать два сэмплера одновременно.

  • На десктопных GPU без поддержки ETC следует выполнять транскодирование в BC7.

    Примечание. BC7 всегда поддерживает альфа-канал. Для непрозрачных (single-slice) входных данных ETC1S эталонный транскодер выдаёт блоки BC7 со значениями альфа-канала, установленными в 255.

  • На старых десктопах без поддержки BC7, RGB текстуры (single-slice) должны быть транскодированы в BC1, а текстуры RGBA (dual-slice) — в BC3.

  • Транскодирование в PVRTC1 также поддерживается, но его стоит использовать только при отсутствии других вариантов.

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

    Примечание. Платформы Apple могут не принимать неквадратные текстуры PVRTC1.

  • Если платформа не поддерживает ни один из перечисленных форматов, данные ETC1S можно декодировать в несжатый RGBA.

ETC1S Target Format Selection Flowchart

Выбор цели транскодирования (Red)

  • Как и в случае с данными RGB, ETC1 RGB является наиболее предпочтительным вариантом, поскольку обеспечивает транскодирование без потерь.

    Примечание. При сэмплинге зеленый и синий каналы будут иметь то же значение, что и красный.

    Примечание. EAC R11 можно использовать, когда семантически неиспользуемые каналы (Green и Blue) должны возвращать нули, а сведение каналов (swizzling) не поддерживается.

  • На десктопных GPU без поддержки ETC1 следует выполнять транскодирование в BC4.

    Примечание. При сэмплинге зеленый и синий каналы будут нулевыми.

  • На очень старых десктопах без поддержки BC4 следует выполнять транскодирование в BC1.

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

  • Транскодирование в PVRTC1 должно быть использовано только при отсутствии других вариантов.

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

    Примечание. Платформы Apple могут не принимать неквадратные текстуры PVRTC1.

    Примечание. При сэмплинге зеленый и синий каналы будут иметь то же значение, что и красный.

  • В крайнем случае данные ETC1S можно декодировать в несжатые пиксели R8 или RGBA8.

ETC1S Target Format Selection Flowchart

Выбор цели транскодирования (Red-Green)

  • У текстур ETC1S Red-Green два независимо закодированных среза, поэтому предпочтительно использовать EAC RG11.

    Примечание. При сэмплинге канал синего будет нулевым.

    Примечание. На платформах, которые поддерживают только ETC1 RGB каждый срез ETC1S можно транскодировать в отдельную текстуру ETC1 RGB и использовать два сэмплера одновременно.

  • На десктопных GPU без поддержки EAC RG11 оба среза транскодируют в одну текстуру BC5.

    Примечание. При сэмплинге синий канал будет нулевым.

  • В крайнем случае данные ETC1S можно декодировать в несжатые RG8 или RGBA8.

ETC1S Target Format Selection Flowchart

Кодек UASTC

Обзор

UASTC — это виртуальный формат текстур с блочным сжатием, разработанный для быстрого и эффективного транскодирования (преобразования) в аппаратно поддерживаемые блочно-сжатые форматы GPU. Созданный на основе передовых методов сжатия текстур ASTC и BC7, он может обрабатывать все виды 8-битных текстурных данных: цветовых карт, карт нормалей, карт высот и т.д. Применение RDO (оптимизация скорости и искажения) во время кодирования позволяет оптимизировать выходные данные UASTC для последующего сжатия без потерь в стиле LZ, что обеспечивает более эффективную передачу и хранение. Контейнер формата KTX v2 использует Zstandard для сжатия без потерь.

Формат данных

Блоки UASTC внутри могут иметь от 2 до 4 каналов цвета. Кодировщик выбирает различные режимы блоков в зависимости от содержимого текстуры. Во всех случаях используется только один “срез” (slice) данных UASTC.

Дескриптор формата данных UASTC в контейнере формата KTX v2 содержит одну запись channelType.

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

КаналыchannelTypeТипичное применение
RGBKHR_DF_CHANNEL_UASTC_RGBНепрозрачная цветовая текстура
RGBAKHR_DF_CHANNEL_UASTC_RGBAЦветовая текстура с альфа-каналом
RedKHR_DF_CHANNEL_UASTC_RRRОдноканальная текстура
Red-GreenKHR_DF_CHANNEL_UASTC_RGДвухканальная текстура

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

Текстуры UASTC состоят из блоков 4x4, каждый блок занимает ровно 16 байт. Сжатие Zstandard (если оно присутствует) следует декодировать до транскодирования текстуры.

Поскольку UASTC — “виртуальный” формат, перед загрузкой в GPU его нужно преобразовать в один из аппаратно поддерживаемых форматов. Приложения должны выбирать целевой формат опираясь на возможности платформы и сценарий использования.

Когда в текстурных данных используется нелинейное кодирование sRGB (практически все цветные текстуры используют его), приложениям следует использовать аппаратные декодеры sRGB для корректной фильтрации. Это может быть легко достигнуто загрузкой сжатых данных с соответствующим значением формата текстуры (см. ниже).

Основные цели транскодирования

По замыслу UASTC оптимизирован для быстрого и предсказуемого транскодирования в ASTC и BC7. Транскодирование в ASTC всегда осуществляется без потерь (результат совпадает с декодированием в RGBA8), транскодирование в BC7 — практически без потерь.

ASTC 4x4 следует выбирать по умолчанию, при наличии поддержки ASTC LDR.

Примечание. На момент написания ASTC LDR поддерживают, в частности:

  • Apple A8 и новее, Apple M1
  • Arm Mali-T620 и новее
  • ImgTec PowerVR Series6 и новее
  • Intel Gen9 («Skylake») и новее
  • NVIDIA Tegra
  • Qualcomm Adreno 3xx и новее

BC7 следует выбирать когда BC7 поддерживается, а ASTC — нет. К таким платформам относится большинство десктопных GPU.

Если нужен результат высокого качества (например, для карт нормалей или других нецветовых карт), но ни ASTC, ни BC7 недоступны, данные UASTC следует декодировать в несжатый RGBA8.

Примечание. Даже для заведомо непрозрачной текстуры обычно лучше загружать её как RGBA8, а не RGB8, из-за выравнивания памяти GPU.

Помимо текстур типов RGB и RGBA, кодек UASTC подходит для текстур Red и Red-Green, поскольку он обеспечивает качество выше, чем у ETC1S. ASTC и BC7 по-прежнему остаются основными целевыми форматами для транскодирования, а несжатые форматы R8 и RG8 являются высококачественными резервными вариантами.

Примечание. Даже для UASTC текстур типа Red или Red-Green после транскодирования неиспользуемые каналы могут содержать ненулевые значения. Приложениям следует сэмплировать только из используемых каналов.

Дополнительные цели транскодирования (RGB и RGBA)

Хотя транскодирование в следующие форматы может привести к потере качества, иногда это может быть лучшим вариантом, чем декодирование в несжатый формат, учитывая уменьшение объема памяти графического процессора. Обычно потеря данных для текстур, содержащих информацию о цвете, является приемлемой.

UASTC RGBA Target Format Selection Flowchart

ETC

Транскодирование UASTC в ETC включает декодирование текстуры в несжатые пиксели и их перекодирование в ETC. Этот процесс полностью реализован эталонным транскодером и частично укорен за счет специфических ETC подсказок (hints), присутствующих в данных UASTC.

Непрозрачные UASTC текстуры должны быть транскодированы и загружены как ETC1 RGB.

UASTC текстуры с альфа-каналом следует транскодировать и загружать как ETC2 RGBA.

S3TC (BC1 / BC3)

Транскодирование UASTC в формат S3TC (также известный как DXT) включает декодирование текстуры в несжатые пиксели и их перекодирование в BC1 или BC3. Этот процесс полностью реализован эталонным транскодером. Транскодирование данных RGB может быть частично ускорено за счет специфических для BC1 подсказок (hints), которые могут присутствовать в данных UASTC.

Непрозрачные UASTC текстуры должны быть транскодированы и загружены как BC1.

UASTC текстуры с альфа-каналом должны быть транскодированы и загружены как BC3.

PVRTC1

Транскодирование UASTC в PVRTC1 включает в себя декодирование текстуры в несжатые пиксели и их перекодирование в PVRTC1. Этот процесс полностью реализован эталонным транскодером.

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

Примечание. Эталонному транскодеру UASTC→PVRTC1 нужно знать, используется ли альфа-канал.

Примечание. Оборудование Apple может не принимать неквадратные текстуры PVRTC1.

16-битные упакованные форматы

Иногда декодирование UASTC в 16-битные упакованные форматы (RGB565 или RGBA4444) может давать лучший результат, чем транскодирование в ETC, BC1/BC3 или PVRTC1, ценой увеличения (примерно в 2 раза) объёма памяти GPU.

Дополнительные цели транскодирования (Red)

Когда ни ASTC, ни BC7 недоступны, Red (одноканальные) UASTC текстуры можно транскодировать в EAC R11 или BC4. Оба варианта занимают меньше памяти GPU, чем несжатый R8. Транскодирование в них требует декодирования UASTC и перекодирования, поэтому оно может быть медленнее, чем использование декодированных данных в исходном виде. Потери качества при транскодировании обычно незначительны, если в текстуре нет контрастных высокочастотных данных.

UASTC Red Target Format Selection Flowchart

Дополнительные цели транскодирования (Red-Green)

Когда ни ASTC, ни BC7 недоступны, Red-Green (двухканальные) UASTC текстуры можно транскодировать в EAC RG11 или BC5. Оба варианта занимают меньше памяти GPU, чем несжатый RG8. Транскодирование в них требует декодирования UASTC и перекодирования, поэтому оно может быть медленнее, чем использование декодированных данных в исходном виде. Потери качества при транскодировании обычно незначительны, если в текстуре нет контрастных высокочастотных данных.

UASTC Red-Green Target Format Selection Flowchart

Поддержка GPU API

Сжатые форматы

ASTC 4x4

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionASTC_LDRVK_FORMAT_ASTC_4x4_SRGB_BLOCKVK_FORMAT_ASTC_4x4_UNORM_BLOCK
WebGLРасширение WEBGL_compressed_texture_astcCOMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHRCOMPRESSED_RGBA_ASTC_4x4_KHR
OpenGL (ES)Расширение GL_KHR_texture_compression_astc_ldrGL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHRGL_COMPRESSED_RGBA_ASTC_4x4_KHR
Direct3DN/AN/AN/A
MetalGPU с MTLGPUFamilyApple2MTLPixelFormatASTC_4x4_sRGBMTLPixelFormatASTC_4x4_LDR

Если платформа позволяет задать режим декодирования ASTC (например, через VK_EXT_astc_decode_mode или GL_EXT_texture_compression_astc_decode_mode), приложениям следует установить значение unorm8.

BC1 (S3TC RGB)

Транскодированные данные занимают 8 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionBCVK_FORMAT_BC1_RGB_SRGB_BLOCKVK_FORMAT_BC1_RGB_UNORM_BLOCK
WebGLРасширения WEBGL_compressed_texture_s3tc и WEBGL_compressed_texture_s3tc_srgbCOMPRESSED_SRGB_S3TC_DXT1_EXTCOMPRESSED_RGB_S3TC_DXT1_EXT
OpenGLРасширения GL_EXT_texture_compression_s3tc и GL_EXT_texture_sRGBGL_COMPRESSED_SRGB_S3TC_DXT1_EXTGL_COMPRESSED_RGB_S3TC_DXT1_EXT
OpenGL ESРасширения GL_EXT_texture_compression_s3tc и GL_EXT_texture_compression_s3tc_srgbGL_COMPRESSED_SRGB_S3TC_DXT1_EXTGL_COMPRESSED_RGB_S3TC_DXT1_EXT
Direct3DУровень 9_1 и вышеDXGI_FORMAT_BC1_UNORM_SRGBDXGI_FORMAT_BC1_UNORM
MetalGPU с MTLGPUFamilyMac1 или MTLGPUFamilyMacCatalyst1MTLPixelFormatBC1_RGBA_sRGBMTLPixelFormatBC1_RGBA

Примечание. В Direct3D и Metal используются перечисления BC1 RGBA, так как эти API не предоставляют BC1 RGB. Транскодированные блоки, созданные эталонным транскодером, в любом случае будут правильно оцифрованы.

BC3 (S3TC RGBA)

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionBCVK_FORMAT_BC3_SRGB_BLOCKVK_FORMAT_BC3_UNORM_BLOCK
WebGLРасширения WEBGL_compressed_texture_s3tc и WEBGL_compressed_texture_s3tc_srgbCOMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXTCOMPRESSED_RGBA_S3TC_DXT5_EXT
OpenGLРасширения GL_EXT_texture_compression_s3tc и GL_EXT_texture_sRGBGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXTGL_COMPRESSED_RGBA_S3TC_DXT5_EXT
OpenGL ESРасширения GL_EXT_texture_compression_s3tc и GL_EXT_texture_compression_s3tc_srgbGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXTGL_COMPRESSED_RGBA_S3TC_DXT5_EXT
Direct3DУровень 9_1 и вышеDXGI_FORMAT_BC3_UNORM_SRGBDXGI_FORMAT_BC3_UNORM
MetalGPU с MTLGPUFamilyMac1 или MTLGPUFamilyMacCatalyst1MTLPixelFormatBC3_RGBA_sRGBMTLPixelFormatBC3_RGBA

BC4

Транскодированные данные занимают 8 байт на каждый блок 4x4.

APIОпределение поддержкиЛинейный формат
VulkanФункция устройства textureCompressionBCVK_FORMAT_BC4_UNORM_BLOCK
WebGLРасширение EXT_texture_compression_rgtcCOMPRESSED_RED_RGTC1_EXT
OpenGLРасширение ARB_texture_compression_rgtcGL_COMPRESSED_RED_RGTC1_EXT
OpenGL ESРасширение GL_EXT_texture_compression_rgtcGL_COMPRESSED_RED_RGTC1_EXT
Direct3DУровень 10_0 и вышеDXGI_FORMAT_BC4_UNORM
MetalGPU с MTLGPUFamilyMac1 или MTLGPUFamilyMacCatalyst1MTLPixelFormatBC4_RUnorm

BC5

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиЛинейный формат
VulkanФункция устройства textureCompressionBCVK_FORMAT_BC5_UNORM_BLOCK
WebGLРасширение EXT_texture_compression_rgtcCOMPRESSED_RED_GREEN_RGTC2_EXT
OpenGLРасширение ARB_texture_compression_rgtcGL_COMPRESSED_RED_GREEN_RGTC2_EXT
OpenGL ESРасширение GL_EXT_texture_compression_rgtcGL_COMPRESSED_RED_GREEN_RGTC2_EXT
Direct3DУровень 10_0 и вышеDXGI_FORMAT_BC5_UNORM
MetalGPU с MTLGPUFamilyMac1 или MTLGPUFamilyMacCatalyst1MTLPixelFormatBC5_RGUnorm

BC7

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionBCVK_FORMAT_BC7_SRGB_BLOCKVK_FORMAT_BC7_UNORM_BLOCK
WebGLРасширение EXT_texture_compression_bptcCOMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXTCOMPRESSED_RGBA_BPTC_UNORM_EXT
OpenGLРасширение GL_ARB_texture_compression_bptcGL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARBGL_COMPRESSED_RGBA_BPTC_UNORM_ARB
OpenGL ESРасширение GL_EXT_texture_compression_bptcGL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXTGL_COMPRESSED_RGBA_BPTC_UNORM_EXT
Direct3DУровень 11_0DXGI_FORMAT_BC7_UNORM_SRGBDXGI_FORMAT_BC7_UNORM
MetalGPU с MTLGPUFamilyMac1 или MTLGPUFamilyMacCatalyst1MTLPixelFormatBC7_RGBAUnorm_sRGBMTLPixelFormatBC7_RGBAUnorm

ETC1 RGB

Транскодированные данные занимают 8 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionETC2VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
WebGLРасширение WEBGL_compressed_texture_etcCOMPRESSED_SRGB8_ETC2COMPRESSED_RGB8_ETC2
OpenGLРасширение GL_ARB_ES3_compatibilityGL_COMPRESSED_SRGB8_ETC2GL_COMPRESSED_RGB8_ETC2
OpenGL ESВерсия 3.0 и вышеGL_COMPRESSED_SRGB8_ETC2GL_COMPRESSED_RGB8_ETC2
Direct3DN/AN/AN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatETC2_RGB8_sRGBMTLPixelFormatETC2_RGB8

Примечание. В WebGL контекстах на базе OpenGL ES 2.0 может быть доступно расширение WEBGL_compressed_texture_etc1, которое предоставляет только линейный формат ETC1 (ETC1_RGB8_OES). Приложениям потребуется декодировать значения sRGB с помощью фрагментного шейдера.

Примечание. В контекстах OpenGL ES 2.0 может быть доступно расширение GL_OES_compressed_ETC1_RGB8_texture, которое предоставляет только линейный формат ETC1 (GL_ETC1_RGB8_OES). Приложениям потребуется декодировать значения sRGB с помощью фрагментного шейдера.

Примечание. Эталонный транскодер выдаёт блоки, которые не используют специфические для ETC2 функции, что позволяет использовать транскодированные данные на оборудовании ETC1.

Примечание. Многие десктопные GPU предоставляют расширение OpenGL GL_ARB_ES3_compatibility, но аппаратной поддержки формата ETC1 RGB у большинства нет — распаковка выполняется в драйвере. На момент написания нативно этот формат поддерживают только десктопные GPU Intel новее «Haswell».

ETC2 RGBA

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanФункция устройства textureCompressionETC2VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
WebGLРасширение WEBGL_compressed_texture_etcCOMPRESSED_SRGB8_ALPHA8_ETC2_EACCOMPRESSED_RGBA8_ETC2_EAC
OpenGLРасширение GL_ARB_ES3_compatibilityGL_COMPRESSED_SRGB8_ALPHA8_ETC2_EACGL_COMPRESSED_RGBA8_ETC2_EAC
OpenGL ESВерсия 3.0 и вышеGL_COMPRESSED_SRGB8_ALPHA8_ETC2_EACGL_COMPRESSED_RGBA8_ETC2_EAC
Direct3DN/AN/AN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatEAC_RGBA8_sRGBMTLPixelFormatEAC_RGBA8

Примечание. В контекстах OpenGL ES 2.0 или WebGL на их базе данные можно транскодировать в две текстуры ETC1: одну для RGB, другую для альфы. Подробнее об использовании аппаратуры ETC1 — в предыдущем разделе.

Примечание. Многие десктопные GPU предоставляют расширение OpenGL GL_ARB_ES3_compatibility, но аппаратной поддержки формата ETC2 RGBA у большинства нет — распаковка выполняется в драйвере. На момент написания нативно этот формат поддерживают только десктопные GPU Intel новее «Haswell».

EAC R11

Транскодированные данные занимают 8 байт на каждый блок 4x4.

APIОпределение поддержкиЛинейный формат
VulkanФункция устройства textureCompressionETC2VK_FORMAT_EAC_R11_UNORM_BLOCK
WebGLРасширение WEBGL_compressed_texture_etcCOMPRESSED_R11_EAC
OpenGLРасширение GL_ARB_ES3_compatibilityGL_COMPRESSED_R11_EAC
OpenGL ESВерсия 3.0 и вышеGL_COMPRESSED_R11_EAC
Direct3DN/AN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatEAC_R11Unorm

Примечание. Многие десктопные GPU предоставляют расширение OpenGL GL_ARB_ES3_compatibility, но аппаратной поддержки формата EAC R11 у большинства нет — распаковка выполняется в драйвере. На момент написания нативно этот формат поддерживают только десктопные GPU Intel новее «Haswell».

EAC RG11

Транскодированные данные занимают 16 байт на каждый блок 4x4.

APIОпределение поддержкиЛинейный формат
VulkanФункция устройства textureCompressionETC2VK_FORMAT_EAC_R11G11_UNORM_BLOCK
WebGLРасширение WEBGL_compressed_texture_etcCOMPRESSED_RG11_EAC
OpenGLРасширение GL_ARB_ES3_compatibilityGL_COMPRESSED_RG11_EAC
OpenGL ESВерсия 3.0 и вышеGL_COMPRESSED_RG11_EAC
Direct3DN/AN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatEAC_RG11Unorm

Примечание. Многие десктопные GPU предоставляют расширение OpenGL GL_ARB_ES3_compatibility, но аппаратной поддержки формата EAC RG11 у большинства нет — распаковка выполняется в драйвере. На момент написания нативно этот формат поддерживают только десктопные GPU Intel новее «Haswell».

PVRTC1

Транскодированные данные занимают 8 байт на каждый блок 4x4.

APIОпределение поддержкиФормат sRGBЛинейный формат
VulkanРасширение VK_IMG_format_pvrtcVK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMGVK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG
WebGLРасширение WEBGL_compressed_texture_pvrtcN/ACOMPRESSED_RGBA_PVRTC_4BPPV1_IMG
OpenGLN/AN/AN/A
OpenGL ESРасширения GL_IMG_texture_compression_pvrtc и GL_EXT_pvrtc_sRGBGL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXTGL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
Direct3DN/AN/AN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatPVRTC_RGBA_4BPP_sRGBMTLPixelFormatPVRTC_RGBA_4BPP

Примечание. WebGL контексты не поддерживают форматы PVRTC1 sRGB. Декодирование sRGB придётся выполнять во фрагментном шейдере.

Несжатые форматы

RGBA8

Размер декодированных данных вычисляется по размерам изображения в пикселях (не в блоках):

1
width * height * 4
APIФормат sRGBЛинейный формат
VulkanVK_FORMAT_R8G8B8A8_SRGBVK_FORMAT_R8G8B8A8_UNORM
WebGLSRGB8_ALPHA8RGBA8
OpenGL (ES)GL_SRGB8_ALPHA8GL_RGBA8
Direct3DDXGI_FORMAT_R8G8B8A8_UNORM_SRGBDXGI_FORMAT_R8G8B8A8_UNORM
MetalMTLPixelFormatRGBA8Unorm_sRGBMTLPixelFormatRGBA8Unorm

Примечание. WebGL 1.0 контексты требуют включения расширения EXT_sRGB для sRGB-фильтрации.

16-битные упакованные форматы

Размер декодированных данных вычисляется по размерам изображения в пикселях (не в блоках):

1
width * height * 2
APIОпределение поддержкиRGBRGBA
VulkanВсегда поддерживаетсяVK_FORMAT_R5G6B5_UNORM_PACK16VK_FORMAT_R4G4B4A4_UNORM_PACK16
WebGLВсегда поддерживаетсяRGB565RGBA4
OpenGL (ES)Всегда поддерживаетсяGL_RGB565GL_RGBA4
Direct3DWDDM 1.2 и новееDXGI_FORMAT_B5G6R5_UNORMN/A
MetalGPU с MTLGPUFamilyApple1MTLPixelFormatB5G6R5UnormMTLPixelFormatABGR4Unorm

Примечание. Приложениям WebGL следует проявлять осторожность при использовании этих форматов, поскольку они будут эмулироваться как RGBA8, если базовая платформа не поддерживает упакованные 16-битные форматы изначально.

Примечание. Аппаратного декодирования sRGB для упакованных форматов нет. Декодирование sRGB придётся выполнять во фрагментном шейдере.

R8

Размер декодированных данных вычисляется по размерам изображения в пикселях (не в блоках):

1
width * height * 1
APIЛинейный формат
VulkanVK_FORMAT_R8_UNORM
WebGL 2.0R8
OpenGL (ES)GL_R8
Direct3DDXGI_FORMAT_R8_UNORM
MetalMTLPixelFormatR8Unorm

RG8

Размер декодированных данных вычисляется по размерам изображения в пикселях (не в блоках):

1
width * height * 2
APIЛинейный формат
VulkanVK_FORMAT_R8G8_UNORM
WebGL 2.0RG8
OpenGL (ES)GL_RG8
Direct3DDXGI_FORMAT_R8G8_UNORM
MetalMTLPixelFormatRG8Unorm
  1. Транскодеры из форматов передачи Basis Universal в форматы сжатия GPU входят в KTX-Software и доступны отдельно в транскодерах Binomial C/C++/WASM и транскодерах Khronos Group WASM↩︎

Пост не является авторским и/или официальным.
Более того - он так же не является профессиональным.

Автор оригинала: Khronos Group
Ссылка на оригинал: KTX 2.0 / Basis Universal Textures — Developer Guide