Поделиться через


Поддержка сетки в D3DX (Direct3D 9)

D3DX — это служебная библиотека, которая предоставляет вспомогательные службы. Это слой над компонентом Direct3D.

Сетки

D3DX реализует конструкцию сетки для загрузки, обработки и отрисовки содержимого X-файла. Сетка в основном является коллекцией вершин, определяющих некоторую геометрию, и набор индексов, определяющих лица. Существует несколько типов сетки.

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

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

Примечание.

Интерфейсы ID3DXPMesh и ID3DXSPMesh (для поддержки прогрессивных и упрощенных сеток соответственно), доступные в предыдущих выпусках Direct3D 9, были удалены.

 

Архитектура сетки

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

Данные объекта Сетки

Сетка содержит буфер вершин, буфер индекса и буфер атрибутов.

  • Буфер вершин содержит данные вершин, которые являются вершинами сетки.
  • Буфер индекса содержит индексы вершин для доступа к буферу вершин. Это может уменьшить размер буфера вершин, уменьшая повторяющиеся вершины. Только индексированная сетка использует буфер индекса. Если сетка состоит из списка треугольников, например, он не использует буфер индекса.
  • Буфер атрибута содержит данные атрибута. Атрибуты — это свойства вершин сетки, в определенном порядке. Сетка D3DX хранит атрибуты в группе DWORDS для каждого лица.

Таблицы атрибутов

Таблица атрибутов — это краткое представление содержимого буфера атрибута. Таблицы атрибутов можно создать, вызвав один из методов Optimize с D3DXMESHOPT_ATTRSORT, заблокируя буфер атрибута и заполняя его данными или вызывая SetAttributeTable. Сетка содержит таблицу атрибутов, когда сетка переупорядочена в группы. Это происходит при вызове оптимизации, при условии, что предоставляется параметр сортировки атрибутов (D3DXMESHOPT_ATTRSORT или более поздней версии). Сетки D3DX используют индексированные списки треугольников и поэтому рисуются с помощью IDirect3Device9::D rawIndexedPrimitive.

Таблицы атрибутов создаются в результате вызова Optimize. Лица не должны быть смежными, так как Оптимизация переупорядочения их будет переупорядочением. Например, руки человеческой сетки могут использовать тот же атрибут. Идентификатор помогает сортировать лица по группам. Сетки из X-файлов автоматически создают атрибуты для свойств материала и текстуры. Чтобы получить хорошую производительность, необходимо вызвать Optimize(ATTRSORT) или более эффективную Оптимизацию (VERTEXCACHE). Функции загрузки пытаются представить данные в точной форме, в ней сохранены. Если вы используете сетку на основе буфера вершин или буфера индекса, API сетки предоставляет функции оптимизации и преобразования кожи с небольшими затратами.

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

Данные приложения

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

Буфер материалов содержит n материалов. Материалы возвращаются функцией Load при загрузке X-файла. Каждое подмножество может иметь собственные материалы и текстуры. Буфер материалов является статическим.

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

Буфер экземпляра эффектов содержит список экземпляров эффектов. Экземпляр эффекта сохраняет состояние. Эти сведения о состоянии используются для инициализации конвейера. Экземпляр эффекта содержит пары "имя-значение" в эффекте.

Дополнительные разделы сетки

Оптимизированные сетки создаются на основе функций базовой сетки и добавляют возможности оптимизации вершинного кэша с двумя методами: Оптимизация, которая создает новую сетку и OptimizeInPlace, которая изменяет исходную сетку.

D3DXGeneratePMesh использует алгоритм упрощения D3DX для создания прогрессивной сетки из входной сетки. D3DXSimplifyMesh создает стандартную сетку заданного уровня детализации из входной сетки с помощью того же алгоритма упрощения. Пользователь управляет метрикой ошибок, используемой с помощью весов, указанных в компоненте вершины и весах, указанных на вершине. Весы для каждого компонента умножаются на часть ошибки, вычисляемой на крае ребра. Весы вершин умножаются на значение метрики ошибки, определенное для удаления этой вершины. Например, если вы никогда не хотите удалить вершину, задайте для этого веса конкретной вершины большое значение. И наоборот, если вы хотите удалить его ранее, задайте для него небольшое значение (менее 1).

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

Шкуры

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

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

Прогрессивное обрезка сетки

Низкие детали области могут позволить себе потерять вершины, которые не изменяют отрисованный внешний вид поверхности. Это особенно верно для объектов, так как они перемещаются дальше от камеры. Это называется уровнем детализации. Пользователи имеют элементы управления отрисовкой на уровне API для настройки уровня детализации для повышения эффективности отрисовки.

Прогрессивные объекты сетки начинаются с большого количества лиц и используют упрощение для уменьшения числа лиц. Прогрессивная сетка, которая является независимой от представления, называется независимой от представления прогрессивной сеткой (VIPM).

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

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

Сетки исправлений

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

D3DX