Технические вопросы и ответы QA1611

Создание текстур в формате сжатия PVRTC

Q: Как я создаю текстуры в формате сжатия PVRTC?

A: Как я создаю текстуры в формате сжатия PVRTC?

SDK iPhone включает инструмент, позволяющий Вам создавать текстуры в формате сжатия PVRTC, точно названном texturetool. Если Вам установили XCode с iPhone OS 2.2 SDK в расположении по умолчанию (/Developer/Platforms/), тогда texturetool расположен в: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool.

texturetool позволяет Вам создавать четыре варианта данных PVRTC, главная разница, являющаяся компромиссами между качеством и размером. Необходимо будет экспериментировать с этими вариантами для определения, какая установка является лучшим компромиссом для каждого отдельного изображения текстуры.

Параметры, которые могут быть переданы texturetool и их функция представлена в остальной части этого документа.

  Опции кодирования перечисления 1.

user$ texturetool -l  Encoders:  PVRTC  --channel-weighting-linear  --channel-weighting-perceptual  --bits-per-pixel-2  --bits-per-pixel-4  Formats:  Raw PVR

texturetool примет значение по умолчанию к --bits-per-pixel-4, --channel-weighting-linear, и -f Сырые данные, если не предоставляются никакие другие возможности.

--bits-per-pixel-2 и --bits-per-pixel-4 опции создают данные PVRTC, кодирующие исходные пиксели в 2 или 4 бита на пиксель. Эти опции представляют фиксированное 16:1 и 8:1 коэффициент сжатия по несжатым 32-разрядным данным изображения RGBA. Существует минимальный размер данных 32 байтов; компрессор никогда не будет производить файлы, меньшие, чем это, и по крайней мере что много байтов ожидаются при загрузке сжатых данных текстуры.

При сжатии указания --channel-weighting-linear распространит ошибку сжатия одинаково через все каналы. В отличие от этого, указание --channel-weighting-perceptual попытки сократить ошибку в зеленом канале по сравнению с линейной опцией. В целом сжатие PVRTC добивается большего успеха с фотографическими изображениями, чем со штриховой графикой.

-m опция позволяет, Вы для автоматической генерации множественно отображаете уровни для исходного изображения. Это выравнивается, предоставлены как дополнительные данные изображения в создаваемом архиве. Если Вы будете использовать Необработанный формат изображения, то каждый уровень данных изображения будет добавлен один за другим к архиву. Если Вы используете формат архива PVR, то каждый множественно отображается, изображение будет предоставлено как отдельное изображение в архиве.

С iPhone OS 2.2, texturetool теперь дополнительные поддержки формат (-f) параметр, позволяющий Вам управлять форматом его выходного файла. В то время как этот параметр не доступен с iPhone OS 2.1 или ранее, произведенные файлы данных совместимы с теми версиями если iPhone OS.

Формат по умолчанию является Сырыми данными, которые эквивалентны формату это texturetool произведенный под iPhone SDK 2.0 и 2.1. Этот формат является сырыми данными сжатые данные текстуры, любой для единственного уровня текстуры (без -m опция), или поскольку каждый уровень текстуры конкатенировал вместе (с -m опция). Каждый уровень текстуры, сохраненный в файле, будет составлять по крайней мере 32 байта в размере и должен быть загружен на GPU полностью.

Формат PVR является тем же форматом, который PVRTexTool от Imagination Technologies PowerVR SDK производит и требует, чтобы парсинг получил фактические данные текстуры. Посмотрите выборку PVRTextureLoader для примера работы с данными текстуры в этом формате.

Перечисление 2  , Кодирующее изображения в формат сжатия PVRTC.

Encode Image.png into PVRTC using linear weights and 4 bpp, and saving as ImageL4.pvrtc
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc Image.png

Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving as ImageP4.pvrtc
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc Image.png

Encode Image.png into PVRTC using linear weights and 2 bpp, and saving as ImageL2.pvrtc
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc Image.png

Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving as ImageP2.pvrtc
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2 -o ImageP2.pvrtc Image.png

Перечисление 3  , Кодирующее изображения в формат сжатия PVRTC при создании предварительного просмотра.

Encode Image.png into PVRTC using linear weights and 4 bpp, and saving the output as ImageL4.pvrtc and a PNG preview as ImageL4.png
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc -p ImageL4.png Image.png

Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving the output as ImageP4.pvrtc and a PNG preview as ImageP4.png
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc -p ImageP4.png Image.png

Encode Image.png into PVRTC using linear weights and 2 bpp, and saving the output as ImageL2.pvrtc and a PNG preview as ImageL2.png
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc -p ImageL2.png Image.png

Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving the output as ImageP2.pvrtc and a PNG preview as ImageP2.png
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2 -o ImageP2.pvrtc -p ImageP2.png Image.png

Демонстрационные изображения, произведенные этими настройками, показаны ниже.

Табличные 1  демонстрационные изображения.

4 бит/пкс, Линейные

Исходный

4 бит/пкс, Перцепционные

Табличные 2  демонстрационные изображения.

2 бит/пкс, Линейные

Исходный

2 бит/пкс, Перцепционные

Перечисление 4 демонстрирует, как можно загрузить Необработанные данные PVRTC на GPU через texImage2DPVRTC демонстрационная функция. Обычно на iPhone OS Вы использовали бы NSBundle и методы NSData для загрузки данных из файла. Для полного примера, демонстрирующего, как загрузить данные текстуры от файла отформатированных данных PVR, посмотрите выборку PVRTextureLoader.

  Пример перечисления 4 загрузки данных PVRTC к графическому процессору.

void texImage2DPVRTC(GLint level, GLsizei bpp, GLboolean hasAlpha, GLsizei width, GLsizei height, void *pvrtcData)
{
    GLenum format;
    GLsizei size = width * height * bpp / 8;
    if(hasAlpha) {
        format = (bpp == 4) ? GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
    } else {
        format = (bpp == 4) ? GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG : GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
    }
    if(size < 32) {
        size = 32;
    }
    glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, size, data);
}

Поскольку пример кода видит выборку PVRTextureLoader.



История версии документа


ДатаПримечания
14.07.2009

Пересмотренный для указания на OpenGL на Руководство по программированию ES. См. та документация для дальнейших обновлений.

27.01.2009

Разъясненная неквадратная поддержка текстуры (это не поддерживается). Соединенный с выборкой PVRTextureLoader.

24.11.2008

Изменения для iPhone SDK 2.2, включающие новое расположение для texturetool и новые опции для его использования.

13.10.2008

Новый документ, описывающий, как создать текстуры в формате сжатия PVRTC.