Android dxt что это

Android: Формат сжатых текстур

Привет. Хотел узнать у вас по поводу «железных» текстур.

Сделал поддежку 3х форматов

  • S3DS (DXT 1 — 5) Это для чипов NVIDIA Tegra
  • PVR — для PowerVR’s
  • ATITC — для Adreno

    Все наборы текстур будут идти в комплекте с игрой, и в зависимости от типа поддерживаемого расширения будут загружаться нужные

    Выбор по расширирениям

    И еще вопрос, как быть с Mali ?
    Из расширений которые они поддерживают
    Все какие то не ведомые

    GL_OES_texture_compression_astc
    GL_KHR_texture_compression_astc_hdr
    GL_KHR_texture_compression_astc_ldr
    GL_OES_compressed_ETC1_RGB8_texture — не пойдет, по причине отсуцтвия альфа канала. Вариант с двумя текстурами, тоже вариант, но пока не до него!

    Раздел Android Texture Formats: https://docs.unrealengine.com/latest/INT/Platforms/Android/Refere… extureformats
    Я делал билды с ETC2, и нормально работало на малишных девайсах.

    wmask
    > Раздел Android Texture Formats:
    > https://docs.unrealengine.com/latest/INT/Platforms/Android/Refere…
    > extureformats
    > Я делал билды с ETC2, и нормально работало на малишных девайсах.
    Супер, спасибо.

    А как узнать поддерживает ли устройсво ETC2 ?
    Чет сколько смотрю, у всех GL_OES_compressed_ETC1_RGB8_texture, а чтобы ETC2 ни у кого не ведать

    К примеру вот последний Mali

    Или поддежка Open GL ES 3.0 автоматически гарантирует 100% что будет работать ETC2 ?

    Просто к примеру проц который используется в iPhone 5s хоть и поддерживает ES 3.0 но ETC2 точно нет!

    FDsagizi
    > А как узнать поддерживает ли устройсво ETC2 ?
    Не знаю. Я просто в википедии смотрел: если у девайса гпу мали, то делал билд под ETC2.

    FDsagizi
    > GL_OES_texture_compression_astc
    > GL_KHR_texture_compression_astc_hdr
    > GL_KHR_texture_compression_astc_ldr
    Это вообще самый крутой формат. Поддерживает всё, можно регулировать степень сжатия. Можно даже сжать так, что плотность данных будет меньше бита на пиксель. Вроде этот формат планируют вводить в следующие версии OpenGL и OpenGL ES.

    FDsagizi
    > Или поддежка Open GL ES 3.0 автоматически гарантирует 100% что будет работать ETC2 ?
    Не факт, что аппаратной поддержки достаточно. Надо, чтобы ещё версия Android была от 4.3.

    FDsagizi
    > Просто к примеру проц который используется в iPhone 5s хоть и поддерживает ES
    > 3.0 но ETC2 точно нет!
    А вообще айфоны поддерживают OpenGL ES 3.0? Если проц поддерживает, то не факт, что драйвер есть. Они вроде как свой API Metal продвигать хотели, а на OpenGL ES выше 2.0 забить. Но я не очень за ним слежу, могу и ошибаться.
    В общем, если устройство заявляет поддержку OpenGL ES 3.0, но не поддерживает ETC2, то оно врёт и OpenGL ES 3.0 не поддерживает, потому что ETC2 часть стандарта.

    FDsagizi
    > Все наборы текстур будут идти в комплекте с игрой, и в зависимости от типа
    > поддерживаемого расширения будут загружаться нужные
    Почему бы не собирать разные APKшки с разными форматами текстур под разные GPU, чтобы пользователи качали только нужные им текстуры? Если ты уже используешь Gradle (а не устаревший ADT), это делается элементарно.

    FDsagizi
    > И еще вопрос, как быть с Mali ?
    Грузить tga.
    > Все ли верно?
    Да. Я так-же делаю. Но ты врядли встретишь расширение GL_ATI_texture_compression_atitc. GL_AMD_compressed_ATC_texture достаточно
    wmask
    > Я делал билды с ETC2, и нормально работало на малишных девайсах.
    >если у девайса гпу мали, то делал билд под ETC2.
    ETC2 не держат Mali ниже T6x т.е. те что не держат OpenGL ES 3.x. Например очень распространенные Mali 400/Mali 450. На каких девайсах это могло работать? может для старых все таки были tga/png ?

    Andrey
    > ETC2 не держат Mali ниже T6x т.е. те что не держат OpenGL ES 3.x. Например
    > очень распространенные Mali 400/Mali 450.
    Странно все это. Вот тут Mali 400 упоминается, а по ссылке в моем первом посте написано, что для мали нужно ставить ETC2. В общем, это уже сами разбирайтесь, я глубоко не копался, даю ссылки на вики UE4. Можно, кстати, посмотреть там исходный код, как они определяют, что использовать.

    Читайте также:  Обход frp android 7 через компьютер

    Сам я, естественно, не тестил на старых девайсах, но эпики пишут: Expected — Device has passed Functional testing

    Так — по скольку у нас OpenGL ES 3.0 обязателен, и Areno 330 мин видео карта.

    Получается что ATI TC не нужен, т.к. Adreno 330 прекрасно работает с ETC2

    Adreno 330 и Mali — ETC2
    Nvidia — DXT1
    Pover WR — PVR

    кстати а как дела с графикой от Intel ? Которая на андроиде идет? На компе то — она спокойно работаетc S3TC(DXT1)

    Кстати посмотреть поддежку текстур, лучше смотреть через — OpenGL Extension Viewer

    FDsagizi
    >и Areno 330 мин видео карта.
    точнее 305 минимум
    >Nvidia — DXT1
    >Pover WR — PVR
    А разве они в случае OpenGL ES 3.0 не держат ETC2 ? если так то для OpenGL ES 3.0 вообще выбрать ETC2, а лучше GL_OES_texture_compression_astc

    Andrey
    > > vidia — DXT1
    > > over WR — PVR
    > А разве они в случае OpenGL ES 3.0 не держат ETC2 ? если так то для OpenGL ES 3.0 вообще выбрать ETC2

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

    Andrey
    > а лучше GL_OES_texture_compression_astc

    Хорошо посмотрю! А не подкинете ссылку, где можно глянуть сравнение и как сжать — либу. А то гугл меня немного в ступор вводит))

    FDsagizi
    > Нету таких устройств, надо смотреть — у нас в городе(Астана) либо блотные, либо
    > дешевые, а на тегре — для геймеров уже несыщешь. На каком форме можно задать
    > вопрос, чтобы узнать такую инфу ?
    То есть ты не веришь, что ETC2 есть везде, где есть OpenGL ES 3.0 и хочешь это проверить?

    FDsagizi
    > Хорошо посмотрю! А не подкинете ссылку, где можно глянуть сравнение и как
    > сжать — либу. А то гугл меня немного в ступор вводит))
    Если не ошибаюсь, есть тулза от Mali, которая сжимает в ASTC и ETC1\2. Только для её скачивания надо вроде бы зарегистрироваться на их сайте.

    Зачем удалил моё сообщение? Каким таким правилам оно не соответствует?

    Источник

    Dxt сжатие в играх

    В этой статье я хочу поделиться своим опытом разработки мобильной игры, поскольку я Windows Phone разработчик, я буду рассказывать про свой опыт применительно к этой системе.

    Память и текстуры

    Если Вы уже занимались разработкой мобильных игр, то основное зло не в нехватке ресурсов CPU/GPU, а в нехватке памяти. Именно о памяти нужно думать в мобильной разработке в первую очередь. В Windows Phone 7 ограничение было в 100мб, в Window Phone 8 стало получше, но не сильно:

    Тип лимита Тип приложения Телефоны с маленьким количеством памяти 1- Гб телефоны 2-Гб телефоны
    Default XNA или native 150 MB 150 MB 150 MB
    Default XAML/.NET excluding XNA 150 MB 300 MB 300 MB
    Higher All app types 180 MB 380 MB 570 MB

    И если Вы разрабатываете игру, в которой довольно большое количество спрайтов (уложенных, конечно же, в атласы) — то вы рано или поздно задумаетесь о количестве этих самых атласов и сжатии текстур.
    Стандартный атлас, с которым работают все более или менее уважающие себя устройства — это 2048х2048 пикселей. Что в несжатом виде (32 bits per pixel) будет занимать аж 2*2*4 = 16 Мб памяти. Тогда на выручку приходят форматы сжатия текстур, в нашем случае это DXT сжатие.
    Сжатые текстуры не только требуют значительно меньше памяти видеокарты, но и вообще отображаются быстрее, чем несжатые текстуры, за счет снижения требований к пропускной способности. Но некоторые качества изображения могут быть потеряны из-за сжатия. Тем не менее, снижение объема памяти позволяет увеличить разрешение текстур, которые будут использоваться, что действительно может дать существенный выигрыш в качестве.

    Читайте также:  Grid autosport android поддерживаемые устройства

    Dxt компрессия уже реализована в .XNA Frameworke, а также в Monogame.
    Для наглядности, возьмем 256 изображений размером 128х128 пикселей, один текстурный атлас из этих текстур размером 2048*2048, и сожмем этот атлас.
    Ходят слухи о том, что быстрее подгружаются текстуры размер, которых кратен степени двойки, для эксперимента изменим немного оригинальную текстуру, срезав один пиксель, доведя ей размер 2048*2047.
    Чтобы показать действенность описанных методов сделаем контрольные замеры. Проводить их будем на телефоне Nokia Lumia 800. Для большей точности сделаем для каждого метода 10 замеров.
    Сведем получившиеся результаты в таблицу 1 и подведем итог.

    Таблица 1. Скорость загрузки изображений.

    256 текстур по 128*128 1 dxt 2048*2048 1 origin 2048*2048 1 origin 2048*2047
    1 00:00:00.6460000 00:00:00.0330000 00:00:00.1510000 00:00:00.1200000
    2 00:00:00.6440000 00:00:00.0330000 00:00:00.1510000 00:00:00.1180000
    3 00:00:00.6470000 00:00:00.0410000 00:00:00.1870000 00:00:00.1570000
    4 00:00:00.6400000 00:00:00.0330000 00:00:00.1490000 00:00:00.1190000
    5 00:00:00.6420000 00:00:00.0330000 00:00:00.1500000 00:00:00.120000
    6 00:00:00.6340000 00:00:00.0470000 00:00:00.1320000 00:00:00.161000
    7 00:00:00.6340000 00:00:00.0500000 00:00:00.1590000 00:00:00.179000
    8 00:00:00.6300000 00:00:00.0500000 00:00:00.1580000 00:00:00.179000
    9 00:00:00.6330000 00:00:00.0480000 00:00:00.1580000 00:00:00.179000
    10 00:00:00.6210000 00:00:00.0470000 00:00:00.1650000 00:00:00.1820000
    Среднее 00:00:00.6371000 00:00:00.0412000 00:00:00.1558000 00:00:00.1514000

    Для наглядности график зависимости различных методов загрузки от времени (рис. 1.)


    Рисунок 1. График зависимости различных методов загрузки от времени.

    Таблица 2. Размеры изображений

    Методы Размеры, Мб
    1 Размер 256 текстур по 128*128 16
    2 Размер текстуры 2048*2048 без сжатия 16
    3 Размер текстуры 2048*2048 с сжатием 4

    Как мы видим из представленных опытов Dxt сжатие очень эффективно. Рассмотрим его более подробно.
    DXT сжатия (также иногда известный как сжатие S3 ) на самом деле очень простое. Вот как это работает:

    • Изображение делится на блоки 4х4
    • Для каждого блока, находится два самых важных цвета
    • Получившиеся два цвета хранятся в 16 битах, в формате RGB 5.6.5
    • Для каждого из 16 пикселей в блоке, хранится 2 бита значения, указывающее, как далеко он находится между двумя основными цветами

    Эта простая схема, оказывается, работает удивительно хорошо для многих реальных изображений мира.

    Есть пять вариантов DXT сжатия:

    • DXT1 работает, как я описал выше, плюс некоторая дополнительная магия для кодирования альфа-канала
    • DXT3 цвет кодируется также, как и DXT1, а также хранит 4 бита значения альфа-канала в пикселе
    • DXT5 цвет кодируется также, как и DXT1, а также подобная схема используется для кодирования альфа-канала
    • DXT2 и DXT4 были не очень-хорошо продуманной попыткой стандартизации и не чего дельного не вышло. Вы должны делать вид, что они не существуют

    DXT1 использует 64 бита на блоке 4×4. По сравнению с 32-битной несжатой текстурой, это 8x кратная степень сжатия. DXT2-5 использует 128 бит в блоке 4×4, которая дает 4х кратная степень сжатия.

    А теперь плохая новость: DXT сжатие – это сжатие с потерями. Иногда они могут быть очень большими. На самом деле это работает очень хорошо для некоторых изображений и совсем не подходит для других.
    Итак, когда Вы хотите использовать Dxt компрессию скажем в XNA, когда Вы устанавливаете свойство текстуры Texture формат, параметр DxtCompressed, Content Pipeline автоматически выбирает между DXT1 и DXT5, в зависимости от того, имеет ли ваша текстура альфа-канал. Если она не содержит альфа-канал или содержит однородный альфа-канал будет использовать DXT1, чтобы получить наилучшую степень сжатия, но если текстура содержит дробные значения альфа-канала, он выберет DXT5 вместо этого.

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

    DXT1 формат предназначен для декомпрессии в реальном времени аппаратными средствами на видеокарте во время рендеринга. DXT1 является форматом сжатия с потерями, с фиксированным коэффициентом сжатия 8:1. DXT1 сжатие является одной из форм кодирования блока усечениями (BTC), где изображение разбивается на непересекающиеся блоки, и пикселей в каждом блоке квантуются на ограниченное число значений. Значения цвета пикселей в блоке 4×4 пиксель аппроксимируются с равноудаленных точек на линии, проходящей через цветовое пространство RGB. Эта линия определяется двумя конечными точками, и для каждого пикселя в блоке 4×4 2-битный индекс хранится в одном из равноудаленных точек на линии. Концы линии, проходящей через цветовое пространство, кодируются в 16-битный формат 5:6:5 RGB и одна или две промежуточные точки генерируется за счет интерполяции. Формат позволяет хранить 1-битный альфа-канал, путем переключения на другой режим, основанный на порядке конечных точек, где создается только одна промежуточная точка и один вывод дополнительного цвета указывает, что он черный и полностью прозрачный.

    Читайте также:  True phone для андроид что это

    Посмотрим на рисунок 2 представленный ниже:
    Левое изображение является оригиналом. Правое иллюстрирует сжатие в формате DXT1.


    Рисунок 2. Пример Dxt1 сжатия.

    Визуально сжатое изображение не отличается от оригинала, что делает результаты сжатия приемлемыми для большинства пользователей. Сжатие, однако, значительно уменьшает размер текстуры.
    В данном случае с 256 КБ до 32 КБ.

    Однако все не так радужно с этой текстурой (рисунок 3):


    Рисунок 3. Пример Dxt1 сжатия.

    Основной проблемой является появление шума внутри текста, a также видны отчетливые полосы на фоне градиента.


    Рисунок 4. Шумы внутри текста.

    На рисунке 5 показано, как сжатие влияет на цвет. Слева Вы видите 16 оттенков красного, от чистого красного до чистого черного. Справа Вы видите четыре цвета, которые получились в результате DXT сжатия, из этих 16 оттенков.


    Рисунок 5. Влияние сжатия на цвет.

    Рисунок 6 показывает, что происходит, когда разные цвета не находятся на одной линии в цветовом пространстве. В этом случае были использованы все крайности палитры RGB (красный, зеленый и синий). Очевидно, в результате интерполированные цвета не совпадают с оригиналами. Обычно в области пикселей 4×4 не такой широкий выбор цветов, но это показывает, что текстуры с различными цветами страдают больше.


    Рисунок 6. Влияние сжатия на цвет.

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

    DXT5 формат, отличается от DXT3 формата, тем что он хранит информацию об альфа канале, подобно тому как хранить информацию о цвете.
    Для информации об альфа-канале он использует палитру подобную той, как храниться цифровая информация. Эта палитра содержит минимальное и максимальное значение альфа-канала. Различают два варианта с 6 и 4 опорными точками.
    6 других значений альфа интерполируются между этим минимумом и максимумом. Таким образом, это позволяет более постепенные изменения значения альфа.
    Второй вариант делает интерполяцию только для 4 других значений альфа-канала между минимальной и максимальной величиной, но также добавляет альфа-значения 0 и 1 (для полностью прозрачными и не прозрачными). Для некоторых текстур это может дать лучшие результаты.


    Рисунок 7. Пример Dxt5 сжатия.

    Как видим, края не очень хорошо обрабатываются в некоторых частях.


    Рисунок 8. Рванные края при использовании Dxt5 сжатия.

    Размер текстуры при этом уменьшился с 256 КБ до 64 КБ.
    Потери качества на реальных изображениях не столь значительны и ими можно для большинства изображений пренебречь.
    Использование Dxt сжатия позволяет:

    • Уменьшить размер установочного пакета
    • Уменьшить размер использования оперативной памяти
    • Увеличить скорость «отрисовки» изображений

    В своем проекте, после создания текстурного атласа, я получаю на выходе .jpg/.png/.bmp и описание атласа в .xml/.txt/.json. Поскольку я использую XNА/Monogame для сжатия в .xnb я использую XNA 4.0 Content Compiler в целом это очень понятное и простое решение, только для использования Dxt сжатия необходимо дописать в ContentBuilder’e при создании buildProject еще одно свойство:

    Источник

  • Оцените статью