Использование UVAtlas (Direct3D 9)
Заметка
UVAtlas первоначально был включён в ныне устаревшую библиотеку D3DX9. Последняя версия доступна на UV Atlas Command-Line Tool (uvatlas.exe).
Многие методы визуализации и генерации контента требуют уникальной, не-перекрывающейся карты 2D-сигнала (например, текстуры) для сетки. К таким методам относятся:
- Карта нормалей/смещений
- Симуляции PRT в текстурном пространстве и световых картах
- Рисование поверхности
- Освещение в пространстве текстур
Создание уникального УФ-сопоставления вручную часто занимает много времени и утомительно; это особенно верно при условии, что входная геометрия сложная и требуется эффективное использование пространства текстуры с низкими искажениями. На следующем рисунке показан пример сетки и соответствующий атлас текстуры.
В этом примере показана сетка (слева) и соответствующая обычная карта СФ-пространства (справа). Обратите внимание, что атлас текстур содержит несколько групп или кластеров данных; каждый кластер называется диаграммой, а в приведенном выше примере отображает обычные данные для части сетки.
API-интерфейсы UVAtlas D3DX автоматически создают оптимальный не перекрывающийся атлас текстур. API предоставляют входные параметры, которые позволяют:
- Свести к минимуму растяжение текстуры, искажение и недосэмплирование.
- Максимизация плотности укладки текстурного пространства для эффективного использования памяти.
- Обеспечьте равномерную выборку по всей сетке, минимизируя разрывы в частоте выборки.
Как работает UVAtlas
API UVAtlas (см. функции UVAtlas) создают атлас текстур путем секционирования поверхности на диаграммы и упаковки диаграмм в атлас текстур. Используйте D3DXUVAtlasPartition и D3DXUVAtlasPack для выполнения этих действий отдельно; или используйте D3DXUVAtlasCreate для секционирования, параметризации и упаковки в одном вызове.
- секционирование и параметризация сетки
- использование встроенных тензоров метрик для управления параметризацией
- Использование данных о смежности для указанных пользователем складок
- упаковка диаграмм в атлас
Секционирование и параметризация сетки
Сначала полигональная сеть делится на участки, затем каждый участок параметризуется в своем собственном [0,1] UV-пространстве. Цилиндр может быть параметризован по одной диаграмме; С другой стороны, для сферы потребуются две диаграммы, как показано на следующем рисунке.
Сетка, которая может быть параметризована с помощью одной карты, классифицируется как "гомеоморфная диску", то есть можно разложить бесконечно гибкий, бесконечно растяжимый диск по карте и идеально покрыть геометрию. Это растяжение, называемое гомеоморфизмом, является двунаправленной функцией; это означает, что можно перейти от одной параметризации к другой, не теряя информацию.
Очень мало реальных сетк может быть параметризовано в два измерения, не разделяя сетку на кластеры или диаграммы. На следующем рисунке показан другой пример сетки и соответствующий атлас текстур.
Существует два параметра, определяющих количество созданных диаграмм:
- Максимальное количество диаграмм, разрешенных для атласа
- Максимально допустимое количество растяжения для каждой диаграммы
Объем растяжения определяет количество создаваемых диаграмм и общее качество выборки. Диапазоны растяжения от 0,0 (без растяжения) до 1,0 (любое количество растяжения). D3DXUVAtlasCreate и D3DXUVAtlasPartition возвращают максимальное растяжение, созданное алгоритмом. На следующем рисунке показан другой пример сетки и соответствующий атлас текстур.
Использование встроенных тензоров метрик для управления параметризацией
Приоритезация текстурного пространства может быть задана для каждого треугольника. Интегрированные тензоры метрик могут быть предоставлены для управления растягиванием треугольников в результирующем текстурном атласе. IMT можно задать напрямую или вычислить на основе входного сигнала с помощью вычислительных функций D3DX для IMT. Интегрированный тензор метрик (или IMT) — это симметричная матрица 2x2, которая описывает, как треугольник растянут в атласе. Каждый IMT определяется тремя числами с плавающей запятой, назовем их (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 можно задать напрямую или вычислить на основе входного сигнала с помощью функций для вычисления D3DX IMT: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal и D3DXComputeIMTFromTexture_graphics.
Укажите данные IMT непосредственно, если требуется управлять выделением пространства текстур для отдельных треугольников. Таким образом, выделите больше области в атласе для важных областей сетки (например, лица персонажа, логотипа на груди или областей сцены рядом с путём следования игрока). Указав IMT, которые являются кратными единичной матрице, результирующие треугольники будут равномерно масштабироваться в пространстве текстур.
Например, учитывая обычную карту с высоким разрешением, вы можете вычислить imT, чтобы обеспечить больше пространства текстур для областей более высокой частоты сигнала в обычной карте. Треугольники, которые являются "плоскими" (которые сопоставлены с константными областями исходной нормальной карты) получат меньше места текстуры. Треугольники, которые содержат много деталей карты нормалей, будут занимать больше текстурного пространства в конечном результате. Затем можно изменить размер обычной карты на меньшую текстуру, но сохранить подробные сведения или перекомпьютировать обычную карту с более оптимальным сопоставлением УФ.
Использование данных смежности для указанных пользователем складок
Определяемую пользователем информацию о смежности можно предоставить функции секционирования, чтобы описать предварительно определенные складки в сетке и таким образом определить контур между соседними гранями. Это простой способ указать собственное секционирование диаграмм в качестве входных данных в алгоритм, который будет дополнительно уточнять диаграммы, чтобы уменьшить растяжение до максимально допустимого уровня.
Пример
В этом примере показано, как можно использовать API UVAtlas и средство просмотра DirectX (Dxviewer.exe) для поиска и устранения разрывов в модели, которые могут значительно повлиять на размер атласа текстур. Вы можете получить Dxviewer.exe и узнать об этом из пакета SDK DirectX. Dxviewer.exe был удален из пакета SDK DirectX после версии 2009 г., чтобы получить его, потребуется по крайней мере пакет SDK DirectX за август 2009 г. Дополнительные сведения о пакете SDK DirectX см. в разделе Где находится пакет SDK DirectX?.
Предположим, что вы начали с некоторой модели в любимом программном обеспечении создания контента (в этом примере используется карликовая головная модель, созданная в Майе). Экспортируйте текстурированную модель в 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 или проход нормального сопоставления. Это позволяет избежать необходимости вручную восстанавливать UV-развёртку объекта, если топология сетки была изменена.
Пример использования функций UVAtlas можно найти в инструменте UV Atlas Command-Line (uvatlas.exe).
Связанные разделы