Заполнение Пикселей При Наложении Текстур

Представляем четвертую статью из серии о работе с 3D-моделями в Unity. Предыдущие статьи: «Особенности работы с Mesh в Unity» , «Unity: процедурное редактирование сетки» , «Импорт 3D-моделей в Unity и подводные камни» .

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

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

Речь пойдет не о коде, а о принципе, который можно реализовать на любом языке и в любой среде разработки.



Заполнение пикселей при наложении текстур



Проблемы

Заказ 3D модели обычно сопровождается требованием разрешения текстуры.

Из-за дискретной природы растрового изображения 3D-художник должен поддерживать расстояние в пикселях между частями скана текстуры.

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

Особенно важно обеспечить достаточный отступ на первых этапах работы.

Чаще всего созданием геометрии, включающей в себя наложение текстур, занимается один человек, а прорисовку текстуры — другой.

Ошибка, обнаруженная 3D-художником, доставит меньше хлопот, чем ошибка, обнаруженная дизайнером текстур.

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

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

Первый — уменьшение разрешения текстур во время мип-мэппинга.

Второе - использовать фильтр расширения при формировании световые карты .

Во время создания задачи УФ -разворачиваясь, 3D-художнику необходимо ориентироваться на требования к разрешению текстур, а также учитывать перечисленные нюансы.

Однако многие недостатки без автоматической проверки просто не замечаются.



Заполнение пикселей при наложении текстур

Пример появления артефактов при уменьшении детализации Для простых моделей наложение текстуры может быть создано с помощью автоматических инструментов.

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

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



Заполнение пикселей при наложении текстур

Общие пиксели Проблема недостаточного заполнения пикселей в УФ -scan аналогичен проблеме с наложениями.

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

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

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

УФ - подметает. И не забывайте, что после работы автоматического формирователя в Единство еще нужно проверить УФ2 .

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

Требования к отступам определим на основании следующих параметров: Базовое разрешение текстур.

Минимальное разрешение текстуры, при котором не допускаются кровотечения.

Требуемый размер отступа на минимальной текстуре.

Поскольку размеры используемых нами текстур являются степенями двойки, формула расчета необходимого заполнения при базовом разрешении довольно проста: (baseResolution/minimumResolution) *paddingOnMinTexture. Очевидно, что решение этой проблемы тесно связано с растеризацией.

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



Ключевые идеи

Давайте рассмотрим УФ -пространство и равномерная сетка размерами NxM в диапазоне 0,0–1,0. Ячейки шириной 1/N и высотой 1/M образуют раздел.

УФ -космос.



Заполнение пикселей при наложении текстур

Раздел NxM УФ -космос Возьмем две произвольные точки и обозначим Dn как количество пикселей, занимаемых проекцией на ось U отрезка, соединяющего данные точки.

Аналогично, Dm для оси V. Затем мы определяем расстояние в пикселях как максимум между Dn и Dm.

Заполнение пикселей при наложении текстур

Расстояние пикселей Стоит отметить, что в евклидовом пространстве такие операции движения, как параллельный перенос и вращение, не являются движениями сетки разбиения, если в качестве метрики принять расстояние в пикселях .

Этот нюанс несколько усложнил разработку нашего решения.



Заполнение пикселей при наложении текстур

Назовем его квадратом со стороной в K пикселей.

ядро значения K .

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



Заполнение пикселей при наложении текстур

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

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



Заполнение пикселей при наложении текстур

Пара ребер, образующих вогнутый контур.



Решение

Теперь поговорим непосредственно о проверке смещения пикселя.

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

Порядок выполнения не важен.

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

Сложение всех трёх буферов и есть общий результат. Давайте сначала рассмотрим самый простой фрагмент. Все сводится к поиску ячеек, пересекающихся близкими к вырожденным треугольниками и ребрами, длина которых меньше стороны ядра заданного размера.

Все такие ячейки отмечены в буфере.



Заполнение пикселей при наложении текстур

Результат проверки размеров элементов Прежде чем описывать два других фрагмента, рассмотрим общую логику их работы.

Оба включают обработку кластеров треугольников, называемых оболочками ( ракушки ) или острова ( острова ).

Оболочка для 3D-художника представляет собой связный набор полигонов, то есть каждый полигон в этом наборе имеет соседа, с которым он имеет общие вершины.

Оболочка также является независимым многоугольником.

В дальнейшем оболочки, острова и кластеры означают одно и то же.



Заполнение пикселей при наложении текстур

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

Поскольку единственный многоугольник в Единство — треугольник, определяемый номерами вершин, треугольники считаем смежными, если хотя бы один индекс вершины первого совпадает с индексом любой вершины второго.

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



Заполнение пикселей при наложении текстур

С общей частью мы закончили.

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

На входе — набор кластеров в виде наборов треугольников на УФ -пространство, размер раздела УФ , соответствующее разрешению текстуры (NxM), и значение заполнения P как количество пикселей.

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

Ячейка в матрице результатов помечается, если она входит хотя бы в одну ядро значения K = P + 1 , который пересекает два разных кластера.

Суть работы фрагмента практически изложена в описании результата.

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

В нашей реализации все пары кластеров рассматриваются поочередно.

Для каждой пары определяется площадь пересечения множеств.

размер ядра К , покрытые этими кластерами.

Выберем некоторую пару и обозначим такое множество как Q.

Заполнение пикселей при наложении текстур

Тогда все элементы Q необходимо проверить по следующему критерию: пересекает ли данное ядро хотя бы один треугольник в каждом из кластеров выбранной пары.

Если это так, то отмечаются все ячейки проверяемого ядра.



Заполнение пикселей при наложении текстур

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



Заполнение пикселей при наложении текстур

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

Здесь нужно обработать один кластер.

Входные данные представляют собой набор треугольников.

УФ -пространство, размер раздела УФ , соответствующее разрешению текстуры (NxM), и значение заполнения P как количество пикселей.

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

Нас не интересует внутренняя часть кластера; сначала мы получаем его контур, представленный связным списком ребер.

Соседние треугольники дублируют индексы вершин, поэтому ребро принадлежит контуру, если пара индексов его вершин уникальна для множества ребер кластера.

Разобравшись, какие ребра образуют контур, нужно расположить их так, чтобы получился связный список.

Если после этого шага в список попали не все ребра контура, то либо в кластере есть дырки, либо в данных сетки есть ошибка.

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

Если контур найден, то обработка продолжается.

Мы сформулировали следующее требование к результату.

Пусть пара ребер, образующих вогнутость контура , кресты ядро значения K = P + 1 .

Тогда необходимо отметить ячейки ядра, если обе части контура между ребрами выходят за границы этого ядра.



Заполнение пикселей при наложении текстур

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

Начинаем с условия вогнутости, затем для каждой пары проверяем все ядра, пересекающие оба ребра.

Для проверки ядра выполняются обходы на каждом участке схемы между парой ребер.

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



Заполнение пикселей при наложении текстур

Условие, при котором помечаются ячейки проверяемого ядра


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

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

Каждая пара кластеров и ребер обрабатывается независимо.

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

Конвертируем результат работы алгоритма в текстуру.

Для заданного разрешения это позволяет графически показать области потенциальных недостатков в УФ -мести.

Полученную текстуру также можно применить к модели, чтобы видеть метки непосредственно на геометрии.

В примерах ниже мы специально разрезали кролика и Сюзанну автоматическим инструментом.

Блендер чтобы получить больше артефактов.

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

Зелёным цветом обозначены клетки ядер с особенностями каждого кластера в отдельности.

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

Примеры

Заполнение пикселей при наложении текстур



Заполнение пикселей при наложении текстур

В следующей статье мы рассмотрим алгоритм оптимизации 3D-моделей в сцене путем удаления невидимой геометрии.

Оставайтесь с нами! Теги: #Разработка игр #unity #Работа с 3д графикой #3d графика #компьютерная графика #unity3d #текстуры #графика для игр #3d графика #3d графика #текстура #uv #uv #uv #компьютерная графика

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

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.