Как Преодолеть Распространенные Графические Артефакты

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

Но нет, менеджеры не любят:

«Нам нужно убрать серые пятна и белые линии.

Тут пульсирующая кнопка дергается, там прогресс-бар идет лесенкой».

Смотришь ресурсы игры - в них ничего такого нет, все спрайты обрезаны.

Читаешь код — формулы верны, шейдер достаточно точен.

Но результат был по-прежнему неважен.

Где ошибка?

Как преодолеть распространенные графические артефакты

Небольшой опрос для тех, кто уже знает, откуда берутся артефакты.

Что делать в такой ситуации?

  1. Вам нужна мощная видеокарта и свежие драйвера;
  2. Стоит создавать загружаемые наборы графики для всех возможных разрешений экрана;
  3. Квадратные текстуры со степенями двух измерений не имеют этих проблем;
  4. Это все из-за сжатия графики (PVRTC/DXT5/ETC1/.

    );

  5. В графическом редакторе вам придется слегка размыть края;
  6. Так и должно было произойти, потому что графические данные мы не готовили;
  7. Поможет только сглаживание;
  8. Нам нужны текстуры и цели в предварительно умноженном альфа-режиме.

Какой ответ правильный, почему и как побороть графические артефакты, читайте под катом.



Билинейная фильтрация текстур

Используется на мобильных платформах билинейная фильтрация текстур чтобы спрайты могли двигаться плавно и не размываться на пиксели при разном разрешении.

В терминах OpenGL ES это параметр GL_LINEAR :

   

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



Как преодолеть распространенные графические артефакты

Пример 4-кратного увеличения (центр GL_NEAREST, правый GL_LINEAR).



Как преодолеть распространенные графические артефакты

Пример уменьшения в 2 раза (в центре GL_NEAREST, справа GL_LINEAR).



Как преодолеть распространенные графические артефакты

В игре возле ветвей деревьев можно увидеть белые артефакты, хотя в редакторе ничего подобного нет. По описанию все так Здесь Когда текстура рисуется с масштабом, отличным от 1,0, или с дробными координатами, на границе с прозрачностью появляются цветовые артефакты.

Дело в том, что OpenGL ES для обычных текстур RGBA сначала самостоятельно интерполирует каналы R, G, B, A, а уже потом этот результат смешивается с экраном.

Если для альфа-канала (А) интерполяция выглядит естественно, то для цветовых каналов R, G, B ранее невидимые пиксели начинают влиять на видимых соседей на границе объекта.

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

Это альфа-режим с предварительным умножением, который полезен при рендеринге графики в цель, в частности, при независимой реализации сглаживания 3D-моделей с использованием OpenGL ES 2.0. Альтернативное решение — добавить штрихи в прозрачные области.

Для этого прозрачные пиксели заимствуют цвет у непрозрачного соседа или усредняют цвета у нескольких непрозрачных соседей.

Такой расчет удобно проводить, используя фронт волны от прозрачно-непрозрачной границы.



Как преодолеть распространенные графические артефакты

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

На экранах Retina движение будет довольно плавным.

Только графики будет много.



Пиксельные шейдеры

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

Дело в том, что аппаратное обеспечение рассчитывает физические пиксели в пиксельном шейдере, и для нашей дробной границы текстурные координаты s,t сдвинуты за пределы [0.1].

В режиме GL_CLAMP_TO_EDGE Когда текстура выходит за границы, кадр дублируется.

Для текстур, которые подходят друг к другу, это нормально, но для разных спрайтов происходит утолщение.



Как преодолеть распространенные графические артефакты

Чтобы края спрайта не рябились, достаточно сделать однопиксельную (для масштаба 1) или 2-пиксельную (для масштаба 0,5) прозрачную рамку и нарисовать ее как часть спрайта.

Другими словами, команда обрезки в графическом редакторе не только убирает прозрачность, но и добавляет проблему сглаживания.

Поэтому правильнее было бы сделать обрезку, а затем увеличить холст относительно центра на 2 пикселя (обычная графика) или 4 пикселя (retina-графика с возможностью уменьшения масштаба).



Как преодолеть распространенные графические артефакты



Как преодолеть распространенные графические артефакты

Пример сглаживания границ (вверху) и плавного движения (внизу) Для 3D, кстати, идея перерисовывается тоже работает , но реализация требует предварительных расчетов и формирования дополнительных треугольников с прозрачностью.



Атласы

При размещении текстуры в атласе свойство mode теряется GL_CLAMP_TO_EDGE , потому что теперь он работает на границах всего атласа.

А поскольку дублирования границ элементов атласа нет, то стыки могут сломаться.



Как преодолеть распространенные графические артефакты

Зазоры в меде при размещении текстур в атласе Вот тут-то и приходит на помощь дублирование внешней границы соединяемых элементов в самом атласе.

Размер рамки зависит от масштаба рисунка; обычно достаточно 1-2 пикселей.

При масштабе > = 1 достаточно кадра в один пиксель.

Только в случае уменьшения необходимо 2 и более пикселей.



Сжатые атласы

Чтобы игра работала на устройствах с небольшим объемом оперативной памяти, необходимо сжать атласы в один из доступных форматов: PVRTC, ETC1, DXT1, DXT5, ETC2 и т.д. Особенностью этих аппаратных форматов является разделение всей текстуры на блоки 4х4 и дальнейшее сжатие с потерями.

Помимо блока, как правило, для каждого блока доступно не более 2-х базовых цветов.

В результате все 16 пикселей блока получаются путем выбора из 4 возможных значений, рассчитанных каким-то образом на основе базовых цветов.

Для форматов с независимыми блоками ( И Т.

Д.

1/2 , DXT1/5) достаточно развернуть каждый элемент, умещающийся в обычном атласе, до прямоугольника с размером, кратным 4 пикселям.

В этом случае соседние элементы не будут влиять друг на друга.



Как преодолеть распространенные графические артефакты

Пример выделения элементов атласа в блоки 4х4 Для формата ПВРТС , где практически на каждый пиксель влияют цвета 4 соседних блоков, необходимо разнести элементы атласа на расстояние 4 пикселя.

Это достигается за счет формирования защитной области размером 2 пикселя по контуру каждого элемента атласа, а полезная область в этом случае центрируется.



Как преодолеть распространенные графические артефакты

Для полигональные атласы Помогает соблюдение расстояния между соседними элементами.



Полученные результаты

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

Такая обработка хорошо автоматизирована и, как правило, не отвлекает сотрудников от творческого процесса.

Поэтому в опросе наиболее частый правильный ответ — 6: «Вот так должно было получиться, потому что мы не готовили графические данные».

Замечу, что это не умаляет полезности других методов.

Теперь самое время задуматься и спросить: «Что может делать используемый сборщик ресурсов и способен ли этот процесс подготовить графические данныеЭ» P.S. Приветствуются комментарии по обсуждаемым методам, а также информация о других эффективных способах борьбы с артефактами в 2D-графике.

Теги: #Playrix #игры #Обработка изображений #артефакты #Разработка игр #Обработка изображений

Вместе с данным постом часто просматривают: