Какой формат имеют файлы текстур
Текстурный ресурс — это структура данных для хранения текселей, представляющих собой наименьшие элементы текстуры, которые можно использовать для чтения или записи. При чтении текстуры шейдером ее можно фильтровать по дискретизаторам текстур.
Текстурный ресурс — это структурированный набор данных, предназначенный для хранения текселей. Тексель представляет собой наименьший элемент текстуры, который может использоваться конвейером для чтения или записи. В отличие от буферов текстуры можно фильтровать по дискретизаторам текстур во время их считывания блоками шейдера. Тип текстуры влияет на способ ее фильтрации. Каждый шаг текселя содержит от 1 до 4 компонентов, расположенных в одном из форматов DXGI, определенных _ перечислением в формате DXGI.
Текстуры создаются как структурированные ресурсы с известным размером. Однако каждая текстура может быть типизированной или не иметь типа при создании ресурса, если тип полностью задается с помощью представления при привязке текстуры к конвейеру.
Типы текстур
Direct3D поддерживает несколько представлений с плавающей запятой. Все вычисления с плавающей запятой выполняются в определенном подмножестве 32-битных правил с плавающей запятой одинарной точности IEEE 754.
Существует несколько типов текстур: одно-, двух-, и трехмерный; каждый из них может быть создан с использованием MIP-карт и без них. Direct3D также поддерживает массивы текстур и текстуры с множественной дискретизацией.
Одномерные текстуры
Одномерная текстура в самом простом своем виде содержит данные текстуры, к которым можно обращаться по одной координате текстуры; ее можно отобразить как массив текселей, как показано на следующем рисунке.
На следующем рисунке показана одномерная текстура.
Каждый тексель содержит несколько цветовых компонентов в зависимости от формата хранимых данных. Повышая сложность, можно создать одномерную текстуру с уровнями MIP-карт, как показано на следующем рисунке.
Уровень MIP-карты — это текстура, которая меньше вышестоящего уровня на число, соответствующее степени двух. Самый верхний уровень наиболее детализирован, а каждый последующий уровень содержит меньше деталей. В одномерной MIP-карте самый нижний уровень содержит один тексель. Кроме того, уровни MIP всегда уменьшаются до 1:1.
При создании MIP-карт для текстуры с нечетным значением размера более низкий уровень всегда имеет четное значение размера (за исключением низшего уровня, достигающего 1). Например, на схеме показана текстура 5 x 1, следующий низкий уровень которой является текстурой 2 x 1, а следующим (и последним) уровнем MIP является текстура размером 1 x 1. Уровни идентифицируются с помощью индекса, называемого LOD (уровень детализации), который используется для доступа к более мелким текстурам при отрисовке геометрии, находящейся не так близко к камере.
Массивы текстур 1D
Direct3D также поддерживает массивы текстур. Массив одномерных текстур концептуально выглядит как на следующем рисунке.
Этот массив текстур содержит три текстуры. Ширина всех трех текстур равна 5 (это число элементов на первом уровне). Каждая текстура также содержит трехслойную MIP-карту.
Все массивы текстур в Direct3D однородные, это означает, что у каждой текстуры в массиве должна быть одинаковый формат данных и размер (в том числе ширина текстуры и количество уровней MIP). Вы можете создавать массивы текстур различных размеров при условии, что все текстуры в отдельном массиве соответствуют друг другу по размеру.
Двумерные текстуры и массивы двумерных текстур
Ресурс Texture2D содержит двухмерную сетку текселей. На каждый тексель указывает вектор u, v. Поскольку это текстурный ресурс, он может содержать уровни MIP и вложенные ресурсы. Полностью заполненный ресурс двухмерных текстур соответствует изображению на следующем рисунке.
Этот текстурный ресурс содержит одну текстуру 3 x 5 с тремя уровнями MIP.
Ресурс массива двумерных текстур — это однородный массив двумерных текстур; то есть все текстуры имеют одинаковый формат данных и размеры (в том числе уровни MIP). Он имеет аналогичный массиву одномерных текстур макет за исключением того, что теперь текстуры содержат двумерные данных, как показано на следующем рисунке.
Этот массив текстур содержит три текстуры; каждая текстура имеет размер 3 x 5 и два уровня MIP.
Использование массива двумерных текстур как куба текстур
Куб текстур — это массив двухмерных текстур, содержащий 6 текстур, по одной на каждую грань куба. Полностью заполненный куб текстур выглядит, как изображение на следующем рисунке.
Чтение массива двухмерных текстур, содержащего 6 текстур, может производиться из шейдеров со встроенными функциями карт куба, после их привязки к конвейеру с представлением кубической текстуры. Обращение к кубам текстур производится из шейдера с трехмерным вектором, направленным от центра куба текстур.
Трехмерные текстуры
Ресурс трехмерной текстуры (также известной как объемная текстура) содержит трехмерный объем текселей. Поскольку это текстурный ресурс, он может содержать уровни MIP. Полностью заполненная трехмерная текстура выглядит, как изображение на следующем рисунке.
При привязке фрагмента MIP-карты трехмерной текстуры в качестве целевых выходных данных отрисовки (с использованием представления целевого объекта отрисовки) трехмерная текстура ведет себя аналогично массиву двухмерных текстур с n фрагментами. Конкретный фрагмент отрисовки выбирается из этапа шейдера геометрии.
Понятие массива трехмерных текстур не существует, соответственно, подресурс трехмерной текстуры — это один уровень MIP-карты.
Системы координат для Direct3D определены для точек и текселей.
Пиксельная система координат
Система координат для пикселей в Direct3D определяет начало координат целевого объекта отрисовки в левом верхнем углу, как показано на следующем рисунке. Центры пикселей смещены на (0,5f, 0,5f) от целочисленных расположений.
Система координат шаг текселя
Начало системы координат для текселей расположено в верхнем левом углу текстуры, как показано на следующем рисунке. Это упрощает отрисовку выровненных по экрану текстур, поскольку система координат для пикселей совпадает с системой координат для текселей.
Координаты текстуры представлены в виде нормализованного или скалярного числа; каждая координата текстуры сопоставляется определенному текселю следующим образом.
Это самый распространенный формат графических файлов.Свою популярность JPG заслужил гибкой возможностью сжатия данных. При необходимости изображение можно сохранить с максимальным качеством. Либо сжать его до минимального размера файла для передачи по сети.В JPG применяется алгоритм сжатия с потерей качества. Что это нам дает? Явный минус такой системы – потеря качества изображения при каждом сохранении файла. С другой сжатие изображения в 10 раз упрощает передачу данных.На практике, сохранение фотографии с минимальной степенью сжатия не дает видимого ухудшение качества изображения. Именно поэтому JPG – самый распространенный и популярный формат хранения графических файлов.
JPEG 2000 (или jp2).
Новый графический формат, созданный для замены JPEG. При одинаковом качестве размер файла в формате JPEG 2000 на 30% меньше, чем JPG.При сильном сжатии JPEG 2000 не разбивает изображение на квадраты, характерные формату JPEG.К сожалению, на данный момен этот формат мало распростанён и поддерживается только браузерами Safari и Mozilla/Firerox (через Quicktime).
TIFF.
Формат TIFF очень популярен для хранения изображений. Он позволяет сохранять фотографии в различных цветовых пространствах (RBG, CMYK, YCbCr, CIE Lab и пр.) и с большой глубиной цвета (8, 16, 32 и 64 бит). TIFF широко поддерживается графическими приложениями и используется в полиграфии.В отличии от JPG, изображение в TIFF не будет терять в качестве после каждого сохранения файла. Но ,к сожалению, именно из-за этого TIFF файлы весят в разы больше JPG.Право на формат TIFF в данный момент принадлежит компании Adobe. Photoshop может сохранять TIFF без объединения слоев.
PNG.
Формат PNG создан как для улучшения, так и для замены формата GIF графическим форматом, не требующим лицензии для использования. В отличии от GIF, у PNG есть поддержка альфа-канала и возможность хранить неограниченное количество цветов.PNG сжимает данные без потерь, что делает его очень удобным для хранения промежуточных версий обработки изображений.
Также, убедитесь в том что статья пытается соответствовать статье об альтернативных языках.
Contents
Valve Texture Format (VTF) - это проприетарный формат текстур использующийся движком Source. VTF файлы обычно задействуются через VMT файлы вместо использования напрямую, что предоставляет возможность их повторного использования.
VTF файлы могут быть созданы из изображений в формате TGA с помощью Source SDK Tool VTEX или из большинства основных форматов изображений с помощью сторонних инструментов. И текстуры и материалы хранятся в подпапках game_dir/materials/ .
Возможности
Формат VTF может хранить двумерную текстуру, либо карту окружения, либо объемную текстуру. Каждая из этих текстур может иметь несколько кадров.
- Карта окружения (environment map) - это шестигранная кубическая карта.
- Объемная текстура (volumetric texture) - это текстура с глубиной, у которой каждый кадр это слой в третьем измерении. То есть объемная текстура 16x16x16 имеет 16 текстур размером 16x16 сложенных друг на друге (как стопка блинчиков). Этот формат используется внутренне движком Source и у вас не должно быть никакой потребности в создании такой текстуры самому.
- Для каждого кадра и грани, файл VTF содержит и оригинальное изображение и серию mipmap'ов, использующихся для рендера текстуры на различных расстояниях. Так как каждый последующий mipmap имеет 1/2 размера (ширины и высоты) предыдущего, оригинальное изображение должно быть в размерности степени двойки. Не смотря на то, что оригинальное изображение может быть прямоугольным, квадратные mipmap'ы хранятся более эффективно в VTF.
- Начальный кадр (для анимаций)
- Размер бамп мапы
- Значение коэффициента отражения для VRAD
- Копия VTF небольшого разрешения для сэмплирования цвета движком.
Ресурсы
В VTF версии 7.3 появилась расширяемая система ресурсов. Вы можете хранить что угодно, но движок Source распознает только следующие данные:
- Значение CRC для обнаружения "битых" данных.
- An U/V LOD control. This is the highest mipmap which should be loaded when game's Texture Detail setting is "High" ( mat_picmip 0 ). An U LOD Control value of 11 selects the mipmap which is 2048 pixels (2 11 ) across.
Форматы данных изображения
VTF может хранить в себе данные в различных форматах. Некоторые форматы предназначены для движка, некоторые только как промежуточные форматы для преобразований. Несжатые форматы не теряют данных, а сжатые (DXT) - теряют.
Таблица форматов данных изображений
Формат | Red Bits | Green Bits | Blue Bits | Alpha Bits | Total Bits | Сжатие | Поддерживается | Комментарий |
---|---|---|---|---|---|---|---|---|
A8 | 0 | 0 | 0 | 8 | 8 | False | True | |
ABGR8888 | 8 | 8 | 8 | 8 | 32 | False | True | Несжатая текстура с альфа-каналом |
ARGB8888 | 8 | 8 | 8 | 8 | 32 | False | True | |
BGR565 | 5 | 6 | 5 | 0 | 16 | False | True | Несжатая текстура, ограниченная глубина цвета |
BGR888 | 8 | 8 | 8 | 0 | 24 | False | True | Несжатая текстура |
BGR888_BLUESCREEN | 8 | 8 | 8 | 0 | 24 | False | True | |
BGRA4444 | 4 | 4 | 4 | 4 | 16 | False | True | Несжатая текстура с альфа-каналом, половина глубины цвета |
BGRA5551 | 5 | 5 | 5 | 1 | 16 | False | True | |
BGRA8888 | 8 | 8 | 8 | 8 | 32 | Either | True | Также используется для сжатых HDR |
BGRX5551 | 5 | 5 | 5 | 1 | 16 | False | True | |
BGRX8888 | 8 | 8 | 8 | 8 | 32 | False | True | |
DXT1 | N/A | N/A | N/A | 0 | 4 | True | True | Стандартное сжатие, без альфа-канала |
DXT1_ONEBITALPHA | N/A | N/A | N/A | 1 | 4 | True | True | Стандартное сжатие, однобитный альфа-канал |
DXT3 | N/A | N/A | N/A | 4 | 8 | True | True | Uninterpolated Alpha |
DXT5 | N/A | N/A | N/A | 4 | 8 | True | True | Interpolated Alpha (recommended) |
I8 | N/A | N/A | N/A | N/A | 8 | False | True | Luminance (Grayscale) |
IA88 | N/A | N/A | N/A | 8 | 16 | False | True | Luminance (Grayscale) |
P8 | N/A | N/A | N/A | N/A | 8 | False | False | Paletted |
RGB565 | 5 | 6 | 5 | 0 | 16 | False | True | |
RGB888 | 8 | 8 | 8 | 0 | 24 | False | True | |
RGB888_BLUESCREEN | 8 | 8 | 8 | 0 | 24 | False | True | |
RGBA16161616 | 16 | 16 | 16 | 16 | 64 | False | True | Integer HDR Format |
RGBA16161616F | 16 | 16 | 16 | 16 | 64 | False | True | Floating Point HDR Format |
RGBA8888 | 8 | 8 | 8 | 8 | 32 | False | True | |
UV88 | N/A | N/A | N/A | N/A | 16 | False | True | Несжатый формат du/dv |
UVLX8888 | N/A | N/A | N/A | N/A | 32 | False | True | |
UVWQ8888 | N/A | N/A | N/A | N/A | 32 | False | True |
Сжатие HDR
HDR текстуры могут храниться в сжатой форме используя формат BGRA8888.
Эта формула показывает как преобразовать эти цвета в целочисленный HDR (integer): RGB = RGB * (A * 16)
и в HDR с плавающей запятой (floating point):
RGB = (RGB * (A * 16)) / 262144
Выбор формата изображений
Не смотря на то, что VTF предоставляет поддержку широкого ряда форматов изображений, есть только несколько форматов, которые вы, скорее всего, будете использовать. Эти форматы и критерии выбора описаны ниже.
- BGR888: используйте для текстур без альфа-канала и с качественным градиентом (например, карт нормалей и световых ореолов (light halo)).
- BGRA8888: используйте для текстур с альфа-каналом и с качественным градиентом (например, карт нормалей и световых ореолов). Он также может быть использован, чтобы получать высококачественные текстуры.
- DXT1: используйте этот формат для обычных текстур без альфа-канала.
- DXT3: используйте этот формат для обычных текстур с альфа-каналом и резкими градиентами.
- DXT5: используйте этот формат для обычных текстур с альфа-каналом и плавными градиентами.
- I8: используйте этот формат для черно-белых текстур без альфа-канала и с качественным градиентом (например, световые ореолы).
- IA88: используйте этот формат для черно-белых текстур с альфа каналом и качественным градиентом (например, дым или световые ореолы).
- RGBA16161616F: используйте этот формат для HDR текстур.
- UV88: используйте этот формат для DuDv карт.
Флаги изображений
VTF может содержать следующие флаги (версия 7.5):
Флаг | Значение | Комментарий |
Point Sampling | 0x0001 | Низкое качество, фильтрация текстур "пиксельная графика". |
Trilinear Sampling | 0x0002 | Фильтрация текстур среднего качества. |
Clamp S | 0x0004 | Координаты зажима S. |
Clamp T | 0x0008 | Координаты зажима T. |
Anisotropic Sampling | 0x0010 | Качественная фильтрация текстур. |
Hint DXT5 | 0x0020 | Используется в skyboxes. Убедитесь, что края бесшовные. |
PWL Corrected | 0x0040 | Цель неизвестна. |
SRGB | n/a | Использует пространство RGB. Полезно для высоких гамм. Не рекомендуется в версии 7.5. |
No Compress | 0x0040 | Сжатие DXT не используется. Устаревшее |
Normal Map | 0x0080 | Текстура - это карта нормалей. |
No Mipmaps | 0x0100 | Отрисовывать только самые большие MIP-карты. (Не удаляет существующие MIP-карты, а просто отключает их.) |
No Level Of Detail | 0x0200 | Не зависит от настроек разрешения текстуры. |
No Minimum Mipmap | 0x0400 | Если установлено, загружайте MIP-карты размером менее 32x32 пикселей. |
Procedural | 0x0800 | Текстура - это процедурная текстура (код может ее изменять). |
One Bit Alpha | 0x1000 | Используется однобитовый альфа-канал. |
Eight Bit Alpha | 0x2000 | Используется восьмибитный альфа-канал. |
Environment Map | 0x4000 | Текстура - это карта окружения. |
Render Target | 0x8000 | Текстура - это цель рендеринга. |
Depth Render Target | 0x10000 | Текстура - это цель рендеринга глубины. |
No Debug Override | 0x20000 | |
Single Copy | 0x40000 | |
Pre SRGB | 0x80000 | Исправление SRGB уже применено |
One Over Mipmap Level In Alpha | 0x80000 | Заполните альфа-канал значением 1 / Mipmap Level. Устарело (для внутреннего использования VTEX?) |
Premultiply Color By One Over Mipmap Level | 0x100000 | (Для внутреннего использования VTEX?) |
Normal To DuDv | 0x200000 | Текстура - это карта DuDv. (Для внутреннего использования VTEX?) |
Alpha Test Mipmap Generation | 0x400000 | (Для внутреннего использования VTEX?) |
No Depth Buffer | 0x800000 | Не Z-буферизация для обработки видео обычно расстояние визуализации. |
Nice Filtered | 0x1000000 | использование NICE фильтрация для создания MIP-карт. (Для внутреннего использования VTEX?) |
Clamp U | 0x2000000 | Координаты зажима U (для объемных текстур). |
Vertex Texture | 0x4000000 | Может использоваться как вершинная текстура |
SSBump | 0x8000000 | Текстура - это SSBump. (SSB) |
Border | 0x20000000 | Привязка к цвету границы по всем координатам текстуры |
Формат файла
Описание формата VTF.
Структура формата
- VTF заголовок
- VTF Данные изображения с низким разрешением
- Для каждого Mipmap (от наименьшего к наибольшему)
- Для каждого кадра (от первого до последнего)
- Для каждого лица (от первого до последнего)
- Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
- VTF Данные изображения высокого разрешения
- Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
- Для каждого лица (от первого до последнего)
- Для каждого кадра (от первого до последнего)
- VTF заголовок
- Записи ресурсов
- VTF Данные изображения с низким разрешением
- Для каждого Mipmap (от наименьшего к наибольшему)
- Для каждого кадра (от первого до последнего)
- Для каждого лица (от первого до последнего)
- Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
- VTF Данные изображения высокого разрешения
- Для каждого Z-среза (от минимального до максимального; зависит от Mipmap)
- Для каждого лица (от первого до последнего)
- Для каждого кадра (от первого до последнего)
Перечисления
Заголовок формата
VTF данные изображения в низком разрешении
Плотно упакованные данные изображения с низким разрешением в формате, описанном в заголовке. Данные изображения с низким разрешением всегда хранятся в формате сжатого изображения DXT1. Его размеры соответствуют размерам самого большого MIP-карты с шириной или высотой, не превышающей 16 пикселей. то есть для VTF 256x256 пикселей: 16x16, для VTF 256x64 пикселей: 16x4, для VTF 1x32 пикселей: 1x16, для VTF 4x4 пикселей: 4x4.
VTF данные изображения в высоком разрешении
Tхорошо упакованные перемежающиеся данные изображения высокого разрешения в формате, описанном в заголовке. Распространенные форматы изображений включают DXT1, DXT5, BGR888, BGRA8888 и UV88. Все размеры должны быть power of two.
История версий
- Выпущено 19 июля 2010 г. как часть Alien Swarm
- Побитовый эквивалент v7.4.
- Переопределяет и изменяет два флага текстуры.
- Сферы теперь официально избыточны.
- Большинство изменений внутри процесса создания VTF с помощью VTEX, например Форматы MipMap fading, Alpha decay и XBox360.
- Выпущена 10 октября 2007 г. как часть The Orange Box.
- Побитовый эквивалент версии 7.3.
- Решает проблемы, связанные с тем, как выполняется гамма-коррекция текстур для ТВ-вывода на XBOX 360 в сочетании с поиском памяти выгружаемого пула ОС.
- Добавлена расширяемая структура, ориентированная на ресурсы.
- Добавлены ресурсы CRC, управления уровнем детализации текстуры и листа, а также ресурсы изображений с обратной совместимостью и изображений с низким разрешением.
- Добавлено несколько форматов трафаретов глубины, зависящих от поставщика (для внутреннего использования в движке), а также форматы карт нормалей и линейные несжатые форматы.
- Выпущена 18 сентября 2007 г. как часть Team Fortress 2 бета.
- Добавлена поддержка объемных текстур.
- Выпущен 23 сентября 2005 г. как Steam обновление двигателя.
- Добавлена поддержка карты сфер для карт среды. (Это было предназначено для поддержки DirectX 6, которая позже была сокращена.)
- Изначальный выпуск. (Только для внутреннего выпуска, однако некоторые текстуры v7.0 попали в опубликованный заголовок.)
Реализация
Пример независимой от Steam реализации формата файла изображения VTF можно найти в библиотеке LGPL C / C ++. VTFLib.
Назовите самый лучший формат сжатия текстур. Может это PNG, ETC, PVRTC, S3TC, или ещё какой-нибудь? Вопрос непростой, но очень важный. От ответа зависят качество визуального оформления, скорость работы и размеры Android-приложений. Дело осложняется тем, что универсального «самого лучшего формата» попросту не существует. Всё зависит от потребностей разработчика.
Технология наложения текстур на двумерные или трёхмерные модели широко применяется в компьютерной графике. Делается это для того, чтобы улучшить детализацию объектов, которые представлены моделями. Android поддерживает множество форматов сжатия текстур, каждый из них обладает собственными преимуществами и недостатками.
Предварительные сведения о работе с текстурами и о форматах их хранения
Наложение текстур (texture mapping) – это метод «наклеивания» изображения на поверхности фигур или многоугольников. Для того чтобы было понятнее, фигуру можно сравнить с коробкой, а текстуру – с узорной обёрточной бумагой, в которую эту коробку заворачивают для того, чтобы положить в неё что-нибудь хорошее и кому-нибудь подарить. Поэтому в англоязычной литературе наложение текстур называют ещё и «texture wrapping», что можно перевести как «обёртывание текстурами».
Первый танк – это полигональная модель, а второй – та же модель, на которую наложены текстуры.
MIP-карты (Mipmaps) – это оптимизированные группы изображений, которые генерируются для основной текстуры. Обычно их создают для того, чтобы увеличить скорость рендеринга картинки и для сглаживания изображений (anti-aliasing), то есть – для избавления от эффекта «ступенчатых» линий. Каждый уровень карты (его называют «mip», фактически – это одно из растровых изображений, из них состоит набор текстур, входящих в MIP-карту) – это версия исходной текстуры с пониженным разрешением.
Такое изображение используется в случаях, когда текстурированный объект виден с большого расстояния, или когда его размеры уменьшены. Идея использования MIP-карт строится на том факте, что мы попросту не можем различить мелкие детали объекта, который находится далеко от нас или имеет маленькие размеры. Основываясь на этой идее, различные фрагменты карты можно использовать для представления различных частей текстуры, основываясь на размерах объекта. Это увеличивает скорость рендеринга за счёт того, что уменьшенные варианты основной текстуры имеют намного меньше текселей (пикселей текстуры), то есть GPU приходится обрабатывать меньше данных для вывода текстурированной модели. Кроме того, так как MIP-карты обычно подвергаются сглаживанию, серьёзно уменьшается количество заметных артефактов. Здесь мы рассмотрим MIP-карты в форматах PNG, ETC (KTX), ETC2 (KTX), PVRTC, и S3TC.
Portable Network Graphics (PNG)
PNG – это растровый формат хранения изображения, особенно заметный тем, что в нём используется алгоритм сжатия графических данных без потерь информации. Он поддерживает цветные индексированные изображения (24 бита RGB или 32 бита RGBA), полноцветные и полутоновые изображения, а так же – альфа-канал.
Преимущества
Недостатки
- Файлы имеют большие размеры. Это увеличивает размер приложений и потребление памяти.
- Сравнительно высокая потребность в вычислительных ресурсах (что ведет к ухудшению производительности).
Ericsson Texture Compression (ETC)
Ericsson Texture Compression – это формат сжатия текстур, который оперирует блоками пикселей размером 4x4. Изначально Khronos использовал ETC как стандартный формат для Open GL ES 2.0. (эта версия ещё называется ETC1). В результате этот формат доступен практически на всех Android-устройствах. С выходом OpenGL ES 3.0. в качестве нового стандарта использован формат ETC2 – переработанная версия ETC1. Основное различие между этими двумя стандартами заключается в алгоритме, который оперирует пиксельными группами. Улучшения в алгоритме привели к более высокой точности вывода мелких деталей изображений. Как результат, качество изображений улучшилось, а размер файлов – нет.
ETC1 и ETC2 поддерживают сжатие 24-битных RGB-данных, но они не поддерживают сжатие изображений с альфа-каналом. Кроме того, есть два разных формата файлов, относящихся к алгоритму ETC: это KTX и PKM.
KTX – это стандартный формат файла Khronos Group, он предоставляет контейнер, в котором можно хранить множество изображений. Когда MIP-карта создаётся с использованием KTX, генерируется единственный KTX-файл. Формат PKM-файла гораздо проще, такие файлы, в основном, используют для хранения отдельных изображений. Как результат, при использовании PKM в ходе создания MIP-карты получатся несколько PKM-файлов вместо единственного KTX. Поэтому для хранения MIP-карт использовать формат PKM не рекомендуется.
Преимущества
- Размер ETC-файлов, заметно меньше чем размер PNG-файлов.
- Формат поддерживает аппаратное ускорение практически на всех Android-устройствах.
Недостатки
- Качество не так высоко, как у PNG (ETC – это формат сжатия изображений с потерями информации).
- Нет поддержки прозрачности.
PowerVR Texture Compression (PVRTC)
PowerVR Texture Compression – это формат компрессии графических данных с потерями, с фиксированным уровнем сжатия, который используется, преимущественно, в устройствах Imagination Technology PowerVR MBX, SGX и Rogue. Он применяется в качестве стандартного метода сжатия изображений в iPhone, iPod, iPad.
В отличие от ETC и S3TC, алгоритм PVRTC не работает с фиксированными блоками пикселей. В нём используется билинейное увеличение и смешивание с низкой точностью двух изображений низкого разрешения. В дополнение к уникальному процессу сжатия, PVRTC поддерживает формат RGBA (с прозрачностью) и для варианта 2-bpp (2 бита на пиксель), и для варианта 4-bpp (4 бита на пиксель).
Преимущества
- Поддержка альфа-каналов.
- Поддержка RGBA для варианта 2-bpp (2 бита на пиксель) и для варианта 4-bpp (4 бита на пиксель).
- Размер файлов намного меньше, чем у PNG.
- Поддержка аппаратного ускорения на GPU PoverVR.
Недостатки
- Качество не так высоко, как при использовании PNG (PVRTC – это формат сжатия изображений с потерями).
- PVRTC поддерживается только на аппаратном обеспечении PoverVR.
- Обеспечивается поддержка квадратных POT-текстур, то есть текстур, ширина и высота которых являются степенью числа 2, хотя в некоторых случаях имеется поддержка прямоугольных текстур.
- Сжатие текстур в этот формат может быть медленным.
S3 Texture Compression (S3TC) или DirectX Texture Compression (DXTC)
S3 Texture Compression – это формат сжатия графических данных с потерями, с фиксированным уровнем сжатия. Его особенности делают этот формат идеальным для сжатия текстур, используемых в 3D-приложениях, рассчитанных на использование графического ускорителя. Интеграция S3TC с Microsoft DirectX 6.0 и OpenGL 1.3 способствовала его широкому распространению. Существует как минимум 5 различных вариантов формата S3TC (от DXT1 до DXT5). Приложение-пример поддерживает чаще всего используемые варианты (DXT1, DXT3 и DXT5).
DXT1 обеспечивает наиболее сильное сжатие. Каждый входной 16-пиксельный блок конвертируется в 64-битный блок, состоящий из двух 16-битных RGB 5:6:5 цветовых значений и 2-х битной таблицы подстановок размером 4x4. Поддержка прозрачности ограничена одним цветом (1-битная прозрачность).
DXT3 конвертирует каждый блок из 16 пикселей в 128 бит, 64 бита приходятся на данные альфа-канала, 64 – на цветовую информацию. DXT3 очень хорошо подходит для изображений или текстур с резкими переходами между прозрачными и непрозрачными областями. Однако если градаций прозрачности нет, а прозрачные участки в изображении имеются, стоит рассмотреть использование DXT1.
DXT5, как и DXT3, конвертирует каждый блок из 16 пикселей в 128 бит, 64 бита приходятся на данные альфа-канала, 64 – на цветовую информацию. Однако, в отличие от DXT3, DXT5 подходит для изображений или текстур с плавными переходами между прозрачными и непрозрачными областями.
Преимущества
- Размер файла значительно меньше аналогичного PNG-файла.
- Достойное качество, низкий процент артефактов в виде полосок, связанных с наложением цветов.
- Хорошая скорость кодирования и декодирования.
- Аппаратное ускорение на множестве GPU. На настольных системах поддерживается практически всеми решениями, постепенно распространяется и на платформе Android.
Недостатки
- Качество ниже, чем у PNG (S3TC – это формат сжатия изображений с потерями информации).
- Поддерживается не на всех Android-устройствах.
Доступ к данным текстур
Большинство файловых форматов для хранения сжатых текстур предусматривают наличие заголовка, расположенного перед данными изображения. Обычно заголовок содержит сведения о названии формата сжатия текстур, о ширине и высоте текстуры, о её цветовой глубине, о размере данных, о внутреннем формате и другие сведения о файле.
Наша цель заключается в том, чтобы загрузить текстурные данные из различных файлов и наложить их на двумерную модель для сравнения качества изображений и размеров данных. Заголовок, который расположен перед графическими данными, не должен обрабатываться как часть текстуры, если счесть его фрагментом изображения и наложить на модель, это приведет к искажениям. Заголовки файлов у разных форматов сжатия текстур различаются, поэтому каждый формат нуждается в индивидуальной поддержке, иначе правильно загрузить и наложить текстуру не получится.
Обратите внимание
Заголовок PVRTC упакован с учётом наличия члена данных 64-битного пиксельного формата (mPixelFormat в примере). В коде, скомпилированном для ARM, проводится выравнивание заголовка с добавлением к нему 4 дополнительных байтов, в итоге он, из исходного 52-байтового, становится 56-байтовым. Это приводит к тому, что при выводе на ARM-устройствах изображение искажается. В коде, скомпилированном для процессоров от Intel, подобного не происходит. Упаковка заголовка решает проблему с выравниванием на ARM-устройствах, в итоге текстура отображается правильно как на ARM-устройствах, так и на Intel-устройствах.
Вот как выглядит искажение изображения на ARM-устройстве, вызванное выравниванием заголовка
О приложении-примере
Пример Android Texture Compression, фрагменты которого будут приведены ниже, позволяет всем желающим быстро сравнивать качество текстур пяти форматов. А именно, это Portable Network Graphics (PNG), Ericsson Texture Compression (ETC), Ericsson Texture Compression 2 (ETC2), PowerVR Texture Compression (PVRTC), и S3 Texture Compression (S3TC), который иногда называют DirectX Texture Compression (DXTC).
В примере показано, как загружать и использовать текстуры этих форматов с помощью OpenGL ES в Android. Изображения, хранящиеся в разных форматах, располагаются рядом друг с другом, что позволяет сравнить их размер и качество. Выбор наиболее подходящего под конкретный проект формата хранения сжатых текстур позволяет разработчику найти верный баланс между размером приложения, визуальным качеством картинки и производительностью.
В примере производится загрузка изображения, хранящегося в файле каждого из форматов, определение координат для его наложения на модель и отображение фрагмента каждой текстуры. В итоге получается одно изображение, разбитое на четыре текстуры соответствующего формата. Форматы указаны в верхней части экрана, размер файла приведен внизу.
Рассматриваемый здесь пример основан на коде, который создал Уильям Гуо (William Guo). Кристиано Феррейра (Christiano Ferreira), специалист по графическим приложениям Intel, дополнил его примером использования сжатия текстур ETC2. Загрузить код можно здесь.
Форматы сжатия текстур: размеры и качество
Загрузка PNG
С MIP-картами в формате PNG можно работать с помощью простой функции glGenerateMipmap из Khronos OpenGL, которая была создана специально для этой цели. Мы, для чтения и загрузки PNG-файлов, воспользовались кодом, подготовленным Шоном Барретом (Sean Barret), stb_image.c, который находится в открытом доступе. Так же этот код используется для нахождения и выборки участка текстуры, который нужно обработать.
Загрузка ETC / ETC2
Как было упомянуто выше, ETC-текстуры могут храниться в файлах формата KTX и PKM. KTX – это стандартный формат сжатия, используемый как контейнер для нескольких изображений, он идеально подходит для создания MIP-карт. В свою очередь, PKM создан для хранения отдельных сжатых изображений, поэтому создание на его основе MIP-карт приводит к необходимости генерировать множество файлов, а это неэффективно. Поддержка MIP-карт для ETC в примере ограничена форматом KTX.
Khronos предоставляет библиотеку с открытым кодом, написанную на C (libktx), в которой поддерживается загрузка MIP-карт из KTX-файлов. Мы этой библиотекой воспользовались и реализовали код в функции LoadTextureETC_KTX, ответственной за загрузку текстур. Функция, которая непосредственно загружает KTX-файлы, называется ktxLoadTextureM. Она позволяет загружать нужную текстуру из данных в памяти. Эта функция – часть библиотеки libktx, документацию по ней можно найти на сайте Khronos.
Вот фрагмент кода, который инициализирует текстуру и предоставляет поддержку MIP-карт для формата ETC (KTX).
Загрузка PVRTC
Поддержка MIP-карт для PVRTC-текстур – задачка чуть посложнее. После чтения заголовка определяется смещение, которое равняется сумме размеров заголовка и метаданных. Метаданные идут следом за заголовком, они не являются частью изображения. Для каждого сгенерированного уровня карты пиксели группируются в блоки (различия зависят от того, применяется ли кодировка 4 бита на пиксель или 2 бита – и тот и другой варианты подходят для PVRTC). Далее, происходит поиск границ, фиксируется ширина и высота блоков. Затем вызывается функция glCompressedTexImage(), она идентифицирует двумерное изображение в сжатом формате PVRTC. Далее, вычисляется размер пиксельных данных и то, что получилось, добавляется к ранее найденному смещению для того, чтобы сгруппировать набор пикселей для следующего фрагмента карты. Этот процесс повторяется до тех пор, пока не будут обработаны все текстуры, из которых состоит карта.
Загрузка S3TC
После загрузки файла, хранящего S3TC-текстуры, определяется его формат и выполняется чтение MIP-карты, расположенной за заголовком. Производится обход фрагмента карты, пиксели группируются в блоки. Затем, для идентификации двумерного изображения в сжатых данных, вызывается функция glCompressedTexImage(). Общий размер блока затем добавляется к смещению для того, чтобы можно было найти начало следующего фрагмента карты и выполнить те же действия. Это повторяется до тех пор, пока не будут обработаны все уровни карты. Вот фрагмент кода, который инициализирует текстуру и предоставляет поддержку MIP-карт для формата S3TC.
Читайте также: