Что такое компрессия текстур
Сжатие текстур
Если вам нужно сжатие текстур, офлайн генерация MIP-текстурирования или кубическая карта, то такого формата текстур по умолчанию как PNG не будет достаточно. К счастью libGDX предоставляет для этого два варианта – ETC1 файлы и KTX/ZKT текстуры.
Заметим, что в настоящее время ETC1 и KTX/ZKTX не поддерживаются для GWT бекэнда.
Перед тем как вдаваться в подробности, нужно знать, что существует два типа сжатия:
- Сжатие, используемое для хранения текстуры на диске (zip, png, jpg, . ), которое является полезным для уменьшения размеров вашего пакета приложения.
- Сжатие, используемое для хранения текстуры в памяти (ETC1, ETC2, S3TC, . ), которое улучшает производительность игры и минимизирует память приложения во время выполнения (отсюда уменьшение риска, что Android выполнить перезапуск приложения при resume событии).
OpenGL ES 2.0 имеет только один обязательный формат сжатия текстуры: ETC1. Он позволяет уменьшить размер любого RGB8 изображения в шесть раз. Основной недостаток в том, что он является форматом сжатия с потерями. Другой недостаток, что он ограничен RGB8. Для поддержки альфа канала вы должны хранить альфу отдельно:
- В другой текстуре, которая может быть так же ETC1
- В той же текстуре, размещая цветовую часть вашего изображения вверху, и альфа часть внизу.
Экономия видео памяти упадет с 6x до 4x, но это все же стоит усилий. Пример приведен в KTXTest.
ETC1 формат
Формат файла ETC1 является очень простым форматом, особенно для libGDX. Он дает прямой способ поддержки 2D текстур с ETC1 сжатием. Недостатком является невозможность использования MIP-текстурирования и кубической карты.
Сжатие
Сжатие Pixmap, загруженного из файла, и запись его в наш ETC1 файл очень простое:
Pixmap pixmap = new Pixmap(Gdx.files.absolute("image.png"); ETC1.encodeImagePKM(pixmap).write(Gdx.files.absolute("image.etc1"));
Вы также можете использовать утилиту ETC1Compressor из gdx-tools проекта, которая может конвертировать целую иерархию папок.
Загрузка
Когда у вас есть файл со сжатым ETC1 изображением, вы легко может загрузить его, как и любой другой файл изображения:
Texture texture = new Texture(Gdx.files.internal("image.etc1"));
KTX/ZKTX формат
Формат KTX файла является стандартом, предназначенным для хранения OpenGL текстур. Его главное преимущество в поддержке большинства возможностей OpenGL текстур (все форматы сжатия, с или без MIP-текстурирования, кубические карты, массивы текстур и так далее)
Формат ZKTX это просто сжатый (ZIP) KTX, чтобы уменьшить размер файла на диске.
Подготовка файла
Утилита KTXProcessor в gdx-tools проекте предоставляет простой способ подготовки текстур:
использование: KTXProcessor input_file output_file [-etc1|-etc1a] [-mipmaps] input_file Файл текстуры, включаемый в выходной KTX или ZKTX файл Для кубических карт, просто предоставьте 6 входных файлов для соответствующих граней в следующем порядке: X+, X-, Y+, Y-, Z+, Z- output_file Путь выходного файла, его тип основывается на расширении, которое должно быть KTX или ZKTX опции: -etc1 Входной файл будет запакован с использованием ETC1 сжатия, альфа канал отбрасывается -etc1a Входной файл будет запакован с использованием ETC1 сжатия, удвоением высоты и размещением альфа канала в нижней части -mipmaps Входной файл будет обработан для генерации MIP-текстурирования примеры: KTXProcessor in.png out.ktx Создает KTX файл с предоставленной 2D текстурой KTXProcessor in.png out.zktx Создает ZKTX файл предоставленной 2D текстурой KTXProcessor in.png out.zktx -mipmaps Создает ZKTX файл предоставленной 2D текстурой, генерируя все уровни MIP-текстурирования KTXProcessor px.ktx nx.ktx py.ktx ny.ktx pz.ktx nz.ktx out.zktx Создает ZKTX файл предоставленными текстурами кубической карты KTXProcessor in.ktx out.zktx Преобразовывает KTX файл в ZKTX файл
Есть также много сторонних утилит для подготовки KTX текстурных файлов.
- OpenGL SDK предоставляет утилиты для создания KTX файлов.
- Mali SDK предоставляет утилиты для создания KTX файлов, включая обработку альфа канала.
Загрузка
Когда у вас есть файл со сжатым KTX или ZKTX изображением, вы легко может загрузить его, как и любой другой файл изображения:
Texture texture = new Texture(Gdx.files.internal("image.zktx"));
Сжатие текстур
- Сжатие текстур или Компрессия текстур (англ. Texture compression) — это технология сжатия изображения, визуально отображающее совокупность свойств поверхности какого-либо объекта, предназначенное для хранения текстурного атласа в 3D компьютерной графике систем визуализации. В отличие от обычных алгоритмов сжатия изображений, алгоритмы сжатия текстур оптимизированы для случайного доступа.
Связанные понятия
Сжатие изображений — применение алгоритмов сжатия данных к изображениям, хранящимся в цифровом виде. В результате сжатия уменьшается размер изображения, из-за чего уменьшается время передачи изображения по сети и экономится пространство для хранения.
Масштаби́рование изображения — изменение размера изображения с сохранением пропорций. Под масштабированием подразумевается как увеличение («апскейлинг» от англ. upscaling), так и уменьшение («даунскейлинг», англ. downscaling) разрешения изображения. Широко применяется в компьютерной графике, обработке видео, в частности, реализуется на аппаратном уровне в телевизорах и видеопроигрывателях.
Вейвлетное сжатие — общее название класса методов кодирования изображений, использующих двумерное вейвлет-разложение кодируемого изображения или его частей. Обычно подразумевается сжатие с потерей качества.
Тексту́ра — изображение, воспроизводящее визуальные свойства каких-либо поверхностей или объектов. В отличие от рисунка, к текстуре не применяются нормы и требования композиции, поскольку текстура сама по себе художественным произведением не является, хотя и может иногда выступать доминантой в художественном произведении.
Объемный рендеринг — техника, используемая для получения плоского изображения (проекции) трехмерного дискретного набора данных.
Сжатие данных с потерями (англ. lossy compression) — метод сжатия (компрессии) данных, при использовании которого распакованные данные отличаются от исходных, но степень отличия не существенна с точки зрения их дальнейшего использования. Этот тип компрессии часто применяется для сжатия аудио- и видеоданных, статических изображений, в Интернете (особенно в потоковой передаче данных) и цифровой телефонии. Альтернативой является сжатие без потерь.
Детальное текстурирование (англ. Detail mapping) — программная техника в трёхмерной компьютерной графике, которая позволяет улучшить детализацию текстур на близком расстоянии от камеры. Конечный результат создаёт иллюзию использования текстуры огромного разрешения.
Корреляция цифровых изображений (англ. digital image correlation and tracking, (DIC/DDIT)) — оптический метод, используемый в техниках отслеживания и идентификации изображения для точных плоских и объемных измерений изменений на изображении. Этот метод часто используется не только для измерения деформаций, полей перемещений и оптических потоков, но и широко используется во многих областях науки и инженерного ремесла. Одно из наиболее широкоизвестных применений данного метода — идентификация перемещений.
Морфологическая амёба (англ. morphological amoeba) — разновидность нелинейных морфологических операторов, предназначенных для адаптивной фильтрации изображений. Типичная морфилогическая амёба представляет из себя двумерный оконный фильтр, который, подобно остальным базовым операциям математической морфологии, последовательно накладываeтся на весь массив пикселов, однако, в отличие от традиционных операторов, имеет способность к адаптации под локальные особенности и резкие изменения тонкой структуры.
Ячеистая текстура (англ. Cellular texture) — растровое изображение, созданное на основе набора точек, случайно распределенных в двумерном пространстве.
Анизотро́пная фильтра́ция (англ. Anisotropic Filtering, AF) — в трёхмерной графике метод улучшения качества изображения текстур на поверхностях, сильно наклонённых относительно камеры.
Тексту́ра — растровое изображение, накладываемое на поверхность полигональной модели для придания ей цвета, окраски или иллюзии рельефа. Приблизительно использование текстур можно легко представить как рисунок на поверхности скульптурного изображения. Использование текстур позволяет воспроизвести малые объекты поверхности, создание которых полигонами оказалось бы чрезмерно ресурсоёмким. Например, шрамы на коже, складки на одежде, мелкие камни и прочие предметы на поверхности стен и почвы.
Сжа́тие да́нных (англ. data compression) — алгоритмическое преобразование данных, производимое с целью уменьшения занимаемого ими объёма. Применяется для более рационального использования устройств хранения и передачи данных. Синонимы — упаковка данных, компрессия, сжимающее кодирование, кодирование источника. Обратная процедура называется восстановлением данных (распаковкой, декомпрессией).
Дизеринг, дитеринг (англ. dither от среднеанглийского didderen — дрожать) — при обработке цифровых сигналов представляет собой подмешивание в первичный сигнал псевдослучайного шума со специально подобранным спектром. Применяется при обработке цифрового звука, видео и графической информации для уменьшения негативного эффекта от квантования.
Рельефное текстурирование — метод в компьютерной графике для придания более реалистичного и насыщенного вида поверхности объектов.
В электронном растрировании преобразование полутонового изображения в растровое осуществляется без использования фотомеханического растрового эффекта, то есть изображение печатных элементов заданной площади формируется в оптическом тракте экспонирующего устройства.
Сжатие видео (англ. Video compression) — технология цифровой компрессии телевизионного сигнала, позволяющая сократить количество данных, используемых для представления видеопотока. Сжатие видео позволяет эффективно уменьшать поток, необходимый для передачи видео по каналам радиовещания, уменьшать пространство, необходимое для хранения данных на носителе. Недостатки: при использовании сжатия с потерями появляются характерные, иногда отчётливо видные артефакты — например, блочность (разбиение изображения.
Сгла́живание (англ. anti-aliasing) — технология, используемая для устранения эффекта «зубчатости», возникающего на краях одновременно выводимого на экран множества отдельных друг от друга плоских или объёмных изображений. Сглаживание было придумано в 1972 году в Массачусетском технологическом институте в Architecture Machine Group, которая позже стала основной частью Media Lab.
Растеризация (англ. Rasterisation, Rasterization), растрирование — процессы, конечным результатом которых являются растровые изображения.
Нере́зкое маски́рование (англ. unsharp masking) — технологический приём обработки фотографического изображения, который позволяет добиться эффекта ощущения большей резкости изображения за счёт усиления контраста тональных переходов. Реализован в большинстве программных продуктов для профессиональной обработки изображений. Пришёл из плёночной фотографии: в начале XX века весьма трудоёмкий процесс позволял получить тот же эффект, хотя добиться полного контроля над степенью нерезкого маскирования было.
Видеокодек — программа/алгоритм сжатия (то есть уменьшения размера) видеоданных (видеофайла, видеопотока) и восстановления сжатых данных. Кодек — файл-формула, которая определяет, каким образом можно «упаковать» видеоконтент и, соответственно, воспроизвести видео. Также возможно кодирование кроме видео и аудиоинформации, добавления субтитров, векторных эффектов и т. п.
Артефакты сжатия — это заметные искажения изображения, звука, видео, вызываемые сжатием с потерями.
В системах цифрового представления цвета, управление цветом — это контролируемое преобразование между разными моделями представления цвета различных устройств, таких как сканеры, цифровые фото- и видеокамеры, мониторы, экраны телевизоров, принтеры и т. д.
Массив цветных фильтров (мозаика цветных фильтров) — часть светочувствительной матрицы фотоприбора, осуществляющая пространственное цветоделение изображения при помощи фотодатчиков — пикселей матрицы, расположенных за светофильтрами различного цвета. Каждый светочувствительный элемент накрыт одним светофильтром массива.
Редактирование изображений (лат. redactus — приведённый в порядок) — изменение оригинала изображения классическими или цифровыми методами. Также может обозначаться термином ретуши́рование, ре́тушь (фр. retoucher — подрисовывать, подправлять). Целью редактирования является коррекция дефектов, подготовка к публикации, решение творческих задач.
Ре́ндеринг или отрисовка (англ. rendering — «визуализация») — термин в компьютерной графике, обозначающий процесс получения изображения по модели с помощью компьютерной программы.
Билинейная фильтрация — процесс извлечения нескольких пикселей исходной текстуры с последующим усреднением их значений для получения окончательного значения пикселя.
Тексель (сокращение от англ. Texture element) — минимальная единица текстуры трёхмерного объекта. Пиксель текстуры.
Геометрическая карта (англ. geometry map, также известно как англ. geometry image) — двухмерное изображение, которое сохраняет информацию о трёхмерной геометрии.
Стандартное тестовое изображение — цифровой файл, содержащий изображение, служащий для тестирования алгоритмов обработки и сжатия. Использование одинаковых стандартных изображений позволяет различным лабораториям сравнивать свои результаты. В большинстве случаев отбираются такие изображения, с подобными которым и будет использоваться класс техник обработки. Другие изображения выбираются с целью проверки алгоритмов восстановления изображений, например, алгоритмов воспроизведения деталей и текстур.
Гистограмма направленных градиентов (англ. Histogram of Oriented Gradients, HOG) — дескрипторы особых точек, которые используются в компьютерном зрении и обработке изображений с целью распознавания объектов. Данная техника основана на подсчете количества направлений градиента в локальных областях изображения. Этот метод похож на гистограммы направления края, дескрипторы SIFT и контексты формы, но отличается тем, что вычисляется на плотной сетке равномерно распределенных ячеек и использует нормализацию.
Обработка изображений — любая форма обработки информации, для которой входные данные представлены изображением, например, фотографиями или видеокадрами. Обработка изображений может осуществляться как для получения изображения на выходе (например, подготовка к полиграфическому тиражированию, к телетрансляции и т. д.), так и для получения другой информации (например, распознание текста, подсчёт числа и типа клеток в поле микроскопа и т. д.). Кроме статичных двухмерных изображений, обрабатывать требуется.
Процедурное текстурирование — метод создания текстур, при котором изображение текстуры создается с помощью какого-либо алгоритма (процедурного алгоритма).
Результатом сегментации изображения является множество сегментов, которые вместе покрывают всё изображение, или множество контуров, выделенных из изображения (см. Выделение границ). Все пиксели в сегменте похожи по некоторой характеристике или вычисленному свойству, например, по цвету, яркости или текстуре. Соседние сегменты значительно отличаются по этой характеристике.
Цифровая обработка изображения — использование компьютерных алгоритмов для обработки цифровых изображений. Как область цифровой обработки сигналов, цифровая обработка изображения имеет много преимуществ перед аналоговой обработкой. Она позволяет применять гораздо более широкий ряд алгоритмов к входным данным и избежать проблем, таких как добавленные шумы и искажения в процессе обработки. Поскольку изображения определяются как двухмерные (или выше), цифровая обработка изображения может быть промоделирована.
Параллакс-скроллинг (также Параллаксная прокрутка) — техника в компьютерной графике, когда фоновые изображения перемещаются относительно виртуальной камеры медленнее, чем изображения переднего плана, что создает иллюзию глубины двумерной сцены и ощущение погружения в виртуальный мир. Эта техника стала развитием техники многоплоскостной камеры, использовавшейся а традиционной анимации с 1930-х годов. Параллакс-скроллинг получил популярность в двумерной компьютерной графике и, в частности, в компьютерных.
Гомоморфная фильтрация — это обобщенная техника для цифровой обработки сигналов и изображений, с участием нелинейного отображения в другие пространства в которых теория линейных фильтров может быть применена, и отображена обратно в исходное пространство. Это понятие было разработано в 60-х Томасом Стокхамом (Thomas Stockham), Аланом В. Оппенхеимом (Alan V. Oppenheim) и Рональдом Схафером (Ronald W. Schafer) в МТИ.
Свёрточная нейронная сеть (англ. convolutional neural network, CNN) — специальная архитектура искусственных нейронных сетей, предложенная Яном Лекуном в 1988 году и нацеленная на эффективное распознавание образов, входит в состав технологий глубокого обучения (англ. deep learning). Использует некоторые особенности зрительной коры, в которой были открыты так называемые простые клетки, реагирующие на прямые линии под разными углами, и сложные клетки, реакция которых связана с активацией определённого.
Цве́товоспроизведе́ние (в полиграфии, цветной фотографии, цветном телевидении и т. д.) — процесс передачи цветов объекта в его цветном изображении.
Сжатие без потерь используется, когда важна идентичность сжатых данных оригиналу. Обычный пример — исполняемые файлы и исходный код. Некоторые графические файловые форматы (например PNG) используют только сжатие без потерь, тогда как другие (TIFF, FLIF или GIF) могут использовать сжатие как с потерями, так и без потерь.
Растр — точечная структура полутонового изображения, предназначенного для полиграфического воспроизведения методом автотипии.
Дифракция отражённых электронов (ДОЭ) — микроструктурная кристаллографическая методика, используемая для исследования кристаллографических ориентаций многих материалов, которая может использоваться для исследования текстуры или преимущественных ориентаций моно- или поликристаллического материала. ДОЭ может использоваться для индексирования и определения семи кристаллических систем, также применяется для картирования кристаллических ориентаций, исследования дефектов, определения и разделения фаз.
Компенсация движения (англ. Motion Compensation) — один из основных алгоритмов, применяемых при обработке и сжатии видеоданных.
Математическая морфология (ММ) — (морфология от греч. μορφή «форма» и λογία «наука») — теория и техника анализа и обработки геометрических структур, основанная на теории множеств, топологии и случайных функциях. В основном применяется в обработке цифровых изображений, но также может быть применима на графах, полигональной сетке, стереометрии и многих других пространственных структурах.
Бинарное изображение (двухуровневое, двоичное) — разновидность цифровых растровых изображений, когда каждый пиксель может представлять только один из двух цветов.Значения каждого пикселя условно кодируются, как «0» и «1». Значение «0» условно называют задним планом или фоном (англ. background), а «1» —передним планом (англ. foreground).Часто при хранении цифровых бинарных изображений применяется битовая карта, где используют один бит информации для представления одного пикселя.
Кубическая текстура, кубическая карта (англ. Cube mapping, CubeMap) — методика в трёхмерной компьютерной графике, предназначенная преимущественно для моделирования отражений на поверхности объекта. Суть методики — в использовании кубической карты для отображения трёхмерной координаты текстуры в тексель при построении изображений отражения окружения в поверхности объекта. Кубическая карта представляет собой развёртку шести граней куба, каждая грань которого содержит текстуру. Каждая текстура отображает.
Растровая функция — двухмерная квадратная матрица, в ячейках которой стоят весовые значения субэлементов, образующих печатные или пробельные элементы.
В компьютерной графике альфа-композитинг (англ. Alpha compositing) обозначает комбинирование изображения с фоном с целью создания эффекта частичной прозрачности. Этот метод часто применяется для многопроходной обработки изображения с последующей комбинацией этих частей в единое двумерное результирующее изображение.
Растровый графический редактор — специализированная программа, предназначенная для создания и обработки растровых изображений, то есть графики, которая в память компьютера записывается как набор точек, а не как совокупность формул геометрических фигур. Подобные программные продукты нашли широкое применение в работе художников-иллюстраторов, при подготовке изображений к печати типографским способом или на фотобумаге, публикации в интернете.
Алгори́тмы масштаби́рования пи́ксельной гра́фики — алгоритмы масштабирования цифровых изображений, созданные специально для увеличения качества графики низкого разрешения. В отличие от традиционных алгоритмов масштабирования, дают менее размытую картинку.
Работа с компрессией текстур в Unity3D + NGUI
Это мой первый, но надеюсь не последний пост на хабр, так что не судите строго.
Хотелось бы поделиться разработкой, которую мы успешно внедрили у себя в Heyworks и используем на проекте Pocket Troops (Неудержимые). Проблема, с которой сталкивались и сталкиваются все разработчики, при чем не только работающие с NGUI и Unity3d, но и с другими движками и пакетами, это поиск золотой середины между качеством и весом игровых интерфейсов (впрочем, это не только интерфейсов касается). В этой статье я постараюсь помочь убить двух зайцев одной пулей.
В первую очередь, очень большое спасибо хочу сказать товарищу Leopotam за идею, которую он подал нам в обсуждении к статье, так что это он во всем виноват. Идею мы развили, написали замену NGUIшным шейдерам, а так же кое-какие утилиты, упрощающие жизнь. Я не стану приводить замеры, сколько байт мы выйграли в размере билда, сколько наносекунд потеряли, используя более сложные шейдеры, лишь скажу, что вся проделанная работа того стоила — выйгрыш в качестве арта виден невооруженным глазом. Также отмечу, что несмотря на то что статья привязана к NGUI, описанный здесь подход с успехом можно использовать с любыми, не только UI, текстурами. Нужно будет лишь написать соответствующие шейдеры. Но я тороплю события, ведь начать хотелось с другого.
Атласов у нас в проекте немало. Это я к тому, что выбор между визуальным качеством и размером в билде стоял для нас достаточно остро, особенно на грани 100мб для iOS 🙂
Вот, к примеру, главный атлас, содержащий все иконки скиллов и общую графику
Так же есть атлас магазина, с иконками магазина, и два атласа улучшений, с иконками улучшений. Итого 4 атласа 2048х2048. И это не предел, как порадовал нас недавно арт-отдел…
В чем сомнений точно не может быть — атласы надо жать. И здесь всплывает первая проблема — PVRTC уверенно поддерживает только iOS, некоторые андроиды его держат, но некоторые — нет, так что будьте готовы к вылетам по памяти, если вдруг какое-то из устройств не поймет PVRTC и станет работать с несжатой текстурой. Собственно, первое время нам приходилось мириться с таким положением дел. Кроме проблем с поддержкой сжатия, PVRTC дает визуальные артефакты на градиентах и переходах в прозрачность. Хотя, для этого у нас был небольшой хак. Берем текстуру, открываем в фотошопе, накладываем сверху новый слой, залитый серым цветом, на него накладываем шум (Add Noise 12.5%), выставляем способ наложения — soft light, едва заметная прозрачность слоя (обычно 20-40%), и применяем маска по альфе текстуры, чтобы шум не применялся на прозрачных участках. (Подробнее и с картинками можно почитать в статье другого работника Heyworks) Но это на 100% не избавляло от шумов, особенно артефакты виднелись на переходе в прозрачность. Приходилось особо «шумные» спрайты выделять в несжатые атласы. Короче, крутились как могли.
Так мы и пришли, а точнее — резко прыгнули, к тому что имеем сейчас. И об этом по-подробнее.
Суть метода, предложенного Leopotam, заключается в том, чтобы выделить альфа канал из текстуры атласа, и применять сжатие уже к RGB текстуре. Это, в первую очередь избавляет нас от шумов, а так же позволяет нам на андроидах использовать ETC сжатие, которое было недоступно для текстур с альфа каналом.
Но что же делать с альфой? Напрашивается первый вариант — использование Alpha8 текстуры (правда ходят слухи что не все iOS устройства адекватно с ней работают, но вроде как это было давно и неправда). Второй вариант — если у нас от 1 до 4 атласов в проекте, мы можем использовать отдельную текстуру, из r, g, b, a каналов которой будет браться информация о прозрачности спрайтов каждого отдельного атласа (если атласов меньше трех — текстура эта будет RGB).
Расположив альфа-каналы наших четырех атласов в одной текстуре, получаем вот такой психодел.
Однако, замерив суммарный размер получившихся текстур, мы заметим, что немного проигрываем. Не страшно, ведь заметное улучшение качества греет душу. Но на этом мы не останавливаемся. Во-первых, берем текстуру с альфа каналами и делаем ее 16-битной. Этой разрядности вполне хватает для передачи нужной информации, и визуально разницы никто не заметит. Во вторых, экспериментально выяснено, и подтверждено арт-отделом, что если альфа-текстуру использовать размером в два раза меньшим, чем соответствущий ей атлас (то-есть 1к для 2к атласа) — разницы на глаз не заметно, а вот выигрыш в объеме — в 4 раза!
Резонный вопрос — а что делать, если атласов — пять и больше? Есть и для этого ресурсы. Ведь альфа-текстуру мы уменьшили в 4 раза, а значит сможем квадратами разложить всего 4х4=16 атласов! Конечно, проделывать такой титанический труд вручную каждый раз, когда хочется изменить один из атласов — дело неблагодарное. Для этого был написал скрипт, который собирает альфа каналы из атласов, раскладывает в альфа текстуре, и настраивает материалы — маску выбора альфа-канала и смещение текстурных координат для каждого отдельного материала. Но есть одна тонкость, связанная с тем, как NGUI работает с атласами. Ведь когда меняется атлас, к примеру добавляется в него новый спрайт, NGUI при перетасовке спрайтов работает не с исходными текстурами, а с их копиями, запеченными в атласе. Но ведь атласы у нас помечены как RGB, а значит если NGUI прочитает спрайты в из атласа, то мы потеряем всю информацию о прозрачности. Тут приходится либо впиливаться в NGUI, чего очень не хотелось бы, либо поступать так, как сделали мы. А сделали мы два метода. Первый, вызывается перед тем, как что-то поменять в атласе. Он помечает все атласы в своем списке как RGBA, дабы NGUI адекватно отработал. Второй метод, «достает» альфа каналы из атласов, раскладывает их в отдельную текстуру, настраивает и ее, и материалы атласов нужным образом, и возвращает атласы снова в RGB.
Да, немного насчет материалов, а точнее шейдеров. Мы взяли NGUIшный шейдер, и немного переписали его, чтобы альфу он читал не из альфа-канала текстуры атласа, а из выбранного с помощью маски определенного канала альфа-текстуры.
Здесь нас постигла еще одна тонкость работы с NGUI. Дело в том, что для отрисовки, казалось бы, одного и того же UI, используются несколько модификаций одного шейдера. Когда вы используете ClippingPanel — способ обрезания UI внутри нее как раз и задает модификацию шейдера, которая будет подставлена. А это SoftClip или AlphaClip (модификации шейдера именуются соответственно), а следовательно эти шейдера также надо подправить. Этот момент мы в первых экспериментах не учли и получили неработающие скроллируемые списки. Кроме того, в более новой версии NGUI вообще по-другому все работает, шейдера нумеруются по принципу, в который я не вникал пока.
Итак, для чего это все?
— Теперь наш UI выглядит как будто его не жали PVRTC и ETC компрессией, максимально устранены артефакты сжатия
— Размер билда существенно снизился даже по сравнению с версией со сжатыми атласами, молчу что было бы, если бы мы их не жали
— Чуть усложнился процесс работы с атласами, но я верю, что наступит день и мы придем к полной автоматике
— Уверен, что лишние операции в шейдере добавили циклов расчета видеокарте, но разницы пока никто не увидел
По ссылке прошу любить и жаловать:
— Скрипты, обрабатывающие атласы и собирающие альфа-текстуру
— Все шейдеры, о которых говорилось в статье
— Ассет для настройки системы — в него нужно накидать материалы атласов, которые вы хотите обработать.
Со всей этой системой мы постоянно работаем, тестируем, модифицируем, так что все изменения будут постоянно попадать в битбакет (не благодарите, нам не жалко). Скрипты конечно не продакшн качества, некоторые константы надо подкрутить под себя, в частности путь к альфа-текстуре, но не думаю что будут сложности с этим.
Очень надеюсь, что кому-нибудь этот материал будет очень полезен. Жду комментарии, предложения по улучшению, конструктивную критику.
О технологии компрессии текстур S3TC
Нет такого игрока, который не слышал бы термина AGP — Акселерированный Графический Порт, который теперь часто стал использоваться в требованиях к железу для свежих компьютерных игр. Но что же такое AGP? Частенько так случается что аббревиатуры быстро теряют свой смысл при их одомашненном использовании, и мы забываем что они из себя представляют. Так что же такое AGP? (Если вы хорошо понимаете основы AGP, то можете пропустить эту часть).
Согласно Intel, AGP это «высокоскоростной компонент, направленный на отображение 3D графики, основанный на скоростном расширении PCI». Если говорить проще, то это специализированная шина, чьё единственное назначение — быть слотом для 2D/3D акселераторов в системе.
При работе на сегодняшней скорости в 2x AGP позволяет передавать данные с пиковой скоростью 528Мб в секунду, по сравнению со стандартными 132-мя мегабайтами в секунду PCI шины. Используя большую скорость AGP шина позволяет вашему компьютеру хранить огромные текстуры, которые могут быть востребованы 3D играми из оперативной памяти, быстро получать и обрабатывать их вместо хранения в локальной, ограниченной в обьёме памяти акселератора. Что случается, когда не AGP акселератор получает обьёмную текстуру, которая занимает больше места, нежели у него имеется локальной памяти? То же самое, что случается с вашей системой, когда ей не хватает памяти, он начинает свопаться, но в данной ситуации вместо того чтобы делать это на диск, делает это в оперативную память, что при отсутсвии AGP катастрофически снижает производительность системы. Эта концепция AGP текстурирования, реализуемая аппаратно, обычно называется GART — таблица переадресации графических адресов. Если проще, то назначение GART — позволять железу доступ к большим текстурам как к одинарным обьектам данных в системной памяти, разрешая вашей AGP карте и программному обеспечению использовать AGP шину для доступа к одним адресам памяти.
О второй важной возможности AGP можно сказать что она позволяет AGP совместимым адаптерам напрямую манипулировать текстурами, которые хранятся в системной памяти, вместо того, чтобы получать и лишь затем обрабатывать их локально. Этот процесс, известный как Direct Memory Execution, или DIME, позволяет приложениям с интенсивным текстурированием выполнятся из безграничной системной памяти, вместо ограниченной локальной памяти графической карты.
Нужен ли AGP?
Если Вы вспомните выпуск первого чипа Intel для AGp — i440LX, то вспомните и то, что основными критиками AGP в то время приводился довод, что не существует игр, которые сумеют реально использовать AGP и AGP текстурирование. И хотя идея была теоретически прекрасной, в то время прирост производительности был практически незаметен на реальных приложениях. Даже сегодня, играя в Quake 2 мы на самом деле особо не напрягаем память большинства современных акселераторов. А всё потому, что текущие и следующие поколения 3D игр вряд ли реально потребует поддержку AGP текстурирования (имеется в виду что под использованием AGP подразумевается занесение и считывание текстур из ОЗУ), которое компании типа 3Dfx вообще игнорировали в своих PCI решениях (вроде Voodoo 2) или использовали жалкое подобие некоторых функций в картах типа Banshee/Voodoo3, которые не поддерживают AGP текстурирование.
Легко понять, что более детализированные текстуры выглядят элементарно лучше, но к несчастью, более детализированные текстуры занимают больше места, чем их упрощённые аналоги. Это приводит к спору производительности со скоростью, но как всегда мы сейчас не будем заходить слишком далеко в теорию, а остановимся на одном простом сравнении: как бы ни был красив закат, если вы слепы, то всё, что вы увидите, это изменение основного цвета и закат не произведёт на вас должного впечатления. Возможно это несколько грубое и элементарное сравнение. После того, как Вы поиграетесь на Voodoo 2 с экстремально детализированными текстурами при 800×600, а затем сделаете это при 800×600 на карте, основанной на чипе nVidia Riva TNT, вы действительно начнёте замечать разницу. Вы помните, как все специалисты твердили, что AGP в конечном счёте займёт своё место в игровой индустрии? То время, о котором они говорили практически уже пришло. Есть технология, и её надо начать использовать. Компании вроде nVidia, Matrox и S3 предприняли первые шаги в этом направлении, но многое еще предстоит сделать.
Два подхода к улучшению качества текстур.
Итак у нас есть огромные текстуры, которые были переданы из системной памяти через AGP, и эти же текстуры, обрабатываемые благодаря DIME, но как S3 впишется во всё это? Вместо того, чтобы почивать на лаврах AGP и разрешать разработчикам использовать необьятные обьёмы текстур, в S3 осознали, что хотя AGP и позволяет бросать огромные массивы текстур в ОЗУ для обработки, всё же есть ограничение этой технологии. Для начала хотя бы обьём памяти, отдаваемый AGP на использование. Но есть ещё один способ, когда текстуры высокого качества могут хранится в том же обьёме памяти, как и обычные, это способ компрессии текстур от S3, S3 Texture Compression, или коротко S3TC. Сравните качество оригинальной 8-битной текстуры и ее пожатого полноцветного аналога:
(увеличенный вариант при нажатии)
S3TC Compressed Texture.
(увеличенный вариант при нажатии)
Технология S3TC жмет текстуры с коэффициентом 1 к 6 от S3 и потери качества при этом практически не заметны на глаз. S3TC, это не какая то технология, которую S3 разработала за углом и на коленках, это полностью лицензируемая, готовая система компрессии, поддерживаемая в DirectX6. Аналогов на рынке пока не наблюдается, хотя многое разработчики заявили о собственных разработках в этом направлении не желая платить за лицензию.
Ожидается очередная битва стандартов, теперь уже в области компрессии текстур и выиграет тот, чья технология получит поддержку разработчиков.