Использование UVAtlas (Direct3D 9)
Примечание
UvAtlas изначально поставлялась в устаревшей библиотеке D3DX9. Последняя версия доступна на странице UV Atlas Command-Line Tool (uvatlas.exe).
Для многих методов отрисовки и создания содержимого требуется уникальная неперекрытая карта двумерного сигнала (например, текстуры) на сетке. К таким методам относятся:
- Сопоставление нормального/смещения
- Имитация PRT в пространстве текстуры и карты света
- Рисование поверхности
- Освещение пространства текстуры
Создание уникального УФ-сопоставления вручную часто занимает много времени и трудоемко; Это особенно верно, если входная геометрия является сложной и желательно использовать пространство текстур с низкими искажениями. На следующем рисунке показан пример сетки и соответствующий атлас текстур.
В этом примере показана сетка (слева) и соответствующая карта нормального uv-space (справа). Обратите внимание, что атлас текстур содержит несколько групп или кластеров данных. Каждый кластер называется диаграммой и в приведенном выше примере отображает обычные данные для части сетки.
API-интерфейсы UVAtlas D3DX автоматически создают оптимальный неперекрывающийся атлас текстур. API предоставляют входные параметры, которые позволяют:
- Сведите к минимуму растяжение, искажение и недоимение текстуры.
- Максимальное увеличение плотности упаковки пространства текстуры для эффективного использования памяти.
- Обеспечить четную выборку по сетке, сводя к минимуму разрывы в частоте выборки.
Принцип работы UVAtlas
API UVAtlas (см . функции UVAtlas) создают атлас текстур путем разделения поверхности на диаграммы и упаковки диаграмм в атлас текстур. Используйте D3DXUVAtlasPartition и D3DXUVAtlasPack для выполнения этих действий отдельно; или используйте D3DXUVAtlasCreate для секционирования, параметризации и упаковки в одном вызове.
- Секционирование и параметризация сетки
- Использование интегрированных тензоров метрик для управления параметризацией
- Использование данных смежности для заданных пользователем складок
- Упаковка диаграмм в атлас
Секционирование и параметризация сетки
Сначала сетка разбивается на диаграммы, а затем каждая диаграмма параметризуется в собственное [0,1] УФ-пространство. Цилиндр может быть параметризован с помощью одной диаграммы; Для сферы, с другой стороны, потребуется две диаграммы, как показано на следующем рисунке.
Сетка, которая может быть параметризована с помощью одной диаграммы, классифицируется как "гомеоморфная на диск", то есть вы можете распределить бесконечно гибкий, бесконечно растянутый диск по диаграмме и идеально покрыть геометрию. Это растяжение, называемое гомеоморфизмом, является двунаправленной функцией; это означает, что вы можете перейти от одной параметризации к другой, не теряя информации.
Очень немногие реальные сетки можно параметризовать в два измерения без разделения сетки на кластеры или диаграммы. На следующем рисунке показан другой пример сетки и соответствующий ей атлас текстур.
Количество созданных диаграмм определяется двумя параметрами:
- Максимально допустимое количество диаграмм для атласа
- Максимально допустимое количество растяжения для каждой диаграммы
Количество растяжения определяет количество создаваемых диаграмм и общее качество выборки. Растяжение — от 0,0 (без растяжения) до 1,0 (любое количество растяжения). D3DXUVAtlasCreate и D3DXUVAtlasPartition возвращают максимальное значение растяжения, созданное алгоритмом. На следующем рисунке показан другой пример сетки и соответствующий ей атлас текстур.
Использование интегрированных тензоров метрик для управления параметризацией
Определение приоритетов пространства текстуры можно задать для каждого треугольника. Можно предоставить интегрированные тензоры метрик для управления растягиванием треугольников в итоговом атласе пространства текстуры. ImT можно указать напрямую или вычислить на основе входного сигнала с помощью вычислительных функций IMT D3DX. Интегрированный тензор метрик (или IMT) — это симметричная матрица 2x2, которая описывает, как треугольник растягивается в атласе. Каждый IMT определяется по 3 числам с плавающей точкой, вызывая их (a,b,c). Их можно упорядочить в симметричные матрицы 2x2 следующим образом:
a b
b c
Затем IMT можно использовать для поиска расстояния между двумя векторами. Задано два вектора v1 и v2, где :
vector v1
vector v2 = v1 + (s,t)
Расстояние между версиями 1 и 2 можно вычислить следующим образом:
sqrt((s, t) * M * (s, t)^T)
Другими словами, вектор (s,t) может быть величиной растяжения в произвольном направлении в пространстве u-v. В этом случае вектор s — это направление от первой к второй вершине, а t — перекрестное произведение норм и s. Например:
(1,1) * (1,1) = (2,2)
(1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
(1,1)
IMT(2,0,2) scales by 2 with no shearing
IMT можно указать напрямую или вычислить на основе входного сигнала с помощью вычислительных функций IMT D3DX: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal и D3DXComputeIMTFromTexture_graphics.
Укажите данные IMT напрямую, если вы хотите управлять выделением пространства текстуры для отдельных треугольников. Таким образом, выделите больше области в атласе для важных областей сетки (таких как лицо или логотип груди персонажа или области сцены рядом с дорожкой для ходьбы игрока). При указании значений IMT, кратных матрице идентификаторов, результирующий треугольник будет равномерно масштабироваться в пространстве текстуры.
Например, при использовании обычной карты с высоким разрешением можно вычислить IMT, чтобы предоставить больше пространства текстур для областей с более высокой частотой сигнала в обычной карте. Треугольники, которые являются "плоскими" (которые сопоставлены с константными областями исходной обычной карты), будут получать меньше пространства текстуры. Треугольники, содержащие большую часть сведений о обычной карте, получат больше области текстуры в конечном результате. Затем можно повторно преобразовать обычную карту в меньшую текстуру, но сохранить детализацию, или вы можете повторно вычислить обычную карту с более оптимальным сопоставлением UV.
Использование данных смежности для заданных пользователем складок
Определяемые пользователем сведения о смежности можно предоставить функции секционирования, чтобы описать заранее определенные складки в сетке и таким образом определить границу диаграммы между смежными гранями. Это простой способ указать собственное секционирование диаграммы в качестве входных данных в алгоритме, что позволит дополнительно уточнить диаграммы, чтобы привести растяжение к максимально допустимому значению.
Пример
В этом примере показано, как можно использовать API UVAtlas и средство просмотра DirectX (Dxviewer.exe) для поиска и исправления несоответствий в модели, которые могут значительно повлиять на размер атласа текстур. Вы можете получить Dxviewer.exe и узнать о нем из пакета SDK для DirectX. Dxviewer.exe был удален из пакета SDK Для DirectX после версии за август 2009 г., поэтому для его получения вам потребуется по крайней мере пакет SDK DirectX за август 2009 г. Сведения о пакете SDK для DirectX см. в разделе Где находится пакет SDK для DirectX?.
Предположим, что вы начали работу с какой-то моделью в предпочитаемом программном обеспечении для создания содержимого (в этом примере используется модель карликовой головы, созданная в Maya). Экспортируйте текстурированную модель в X-файл и создайте атлас текстур с помощью D3DXUVAtlasCreate. Полученный атлас текстуры будет выглядеть примерно так, как на следующем рисунке.
Атлас содержит 22 диаграммы и максимальный отрезок 0,994.
Теперь посмотрите на текстурированную модель, чтобы увидеть, насколько хорошо атлас текстуры сопоставляется с геометрией. Для этого загрузите модель в средство просмотра:
- Откройте средство просмотра из служебных программ DirectX.
- Загрузите X-файл, нажав кнопку Открыть.
- Включите параметр просмотра складок, нажав кнопку просмотра и выбрав пункт Складки из всплывающего окна.
На следующем рисунке показано, что должно отображаться в средстве просмотра.
Каждая линия представляет собой складку, которая является смежным краем между двумя диаграммами в атласе текстур. Количество диаграмм, создаваемых алгоритмом, вызвано небольшими различиями, возможно, из-за несоответствий в нормали. Эти небольшие различия можно уменьшить с помощью данных о сварочных работах, т. е. принудив к тому, что данные почти равны. Чтобы сварить нормали и шкуры:
- Запустите средство DirectX Ops (dxops.exe) со следующей командной строкой в сетке (заменив modelName.x именем вашей модели):
Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01; save 'newModelName.x';"
При этом сравниваются нормали и веса кожи, и если они отличаются по значению менее чем на 2,01, данные делаются равными. На следующих иллюстрациях показан крупным планом глаза, чтобы увидеть складки перед сваркой (слева) и складки после сварки (справа):
Рис. 7. Удаление складок сварочными работами
В этом примере при сварке удалено 86 вершин из входной сетки. С меньшим количеством складок в сетке можно повторно создать атлас, как показано на следующем рисунке.
Атлас содержит только 7 диаграмм, а максимальный отрезок составляет примерно 0,0776. Новый атлас теперь помещается в меньшую текстуру (примерно на 30 % меньше в этом примере).
Упаковка диаграмм в атлас
После разделения сетки на отдельно параметризованные диаграммы диаграммы необходимо эффективно упаковать в одну карту текстур. Это выполняется как второй шаг D3DXUVAtlasCreate или может быть вызван явным образом путем вызова D3DXUVAtlasPack.
Упакованные диаграммы разделяются заданной пользователем шириной желоба. Ширина желоба — это объем разделения между диаграммами и позволяет выполнять билинейную интерполяцию и MIP-сопоставление, чтобы избежать отрисовки артефактов в границах диаграммы. D3DX предоставляет интерфейс для автоматического заполнения этих желобов. Дополнительные сведения см. в разделе ID3DXTextureGutterHelper .
Интеграция UVAtlas в конвейер
Помимо того, что эти функции вызываются художником до рисования текстур, эти функции можно интегрировать в автоматизированный конвейер искусства. Например, вызов UVAtlas может быть выполнен автоматически после обновления ресурса перед выполнением имитации PRT или обычного прохода сопоставления. Это позволяет избежать необходимости вручную восстанавливать УФ-сопоставление объекта вручную, если топология сетки была изменена.
Пример использования функций UVAtlas см. в статье Uv Atlas Command-Line Tool (uvatlas.exe).
Связанные темы