netlib.narod.ru< Назад | Оглавление | Далее >

10.5. Таблица атрибутов

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


Рис. 10.3. Данные геометрии и содержимое буфера атрибутов отсортированы по значению идентификатора атрибута

Рис. 10.3. Данные геометрии и содержимое буфера атрибутов отсортированы по значению идентификатора атрибута, благодаря чему данные отдельной подгруппы хранятся в непрерывном фрагменте памяти. Теперь можно легко определить где начинаются и где заканчиваются данные подгруппы. Обратите внимание, что каждый блок с пометкой «Tri» в буфере индексов представлен тремя индексами


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

typedef struct _D3DXATTRIBUTERANGE {
     DWORD AttribId;
     DWORD FaceStart;
     DWORD FaceCount;
     DWORD VertexStart;
     DWORD VertexCount;
} D3DXATTRIBUTERANGE;

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

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

Для доступа к таблице атрибутов сетки используется следующий метод:

HRESULT ID3DXMesh::GetAttributeTable(
     D3DXATTRIBUTERANGE* pAttribTable,
     DWORD* pAttribTableSize
);

Данный метод делает две веши: возвращает количество атрибутов в таблице атрибутов и заполняет массив структур D3DXATTRIBUTERANGE данными атрибутов.

Чтобы получить количество элементов в таблице атрибутов, мы передаем в первом аргументе 0:

DWORD numSubsets = 0;
Mesh->GetAttributeTable(0, &numSubsets);

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

D3DXATTRIBUTERANGE table = new D3DXATTRIBUTERANGE [numSubsets];
Mesh->GetAttributeTable(table, &numSubsets);

Мы можем явно инициализировать таблицу атрибутов с помощью метода ID3DXMesh::SetAttributeTable. В приведенном ниже фрагменте выполняется инициализация таблицы атрибутов для 12 подгрупп:

D3DXATTRIBUTERANGE attributeTable[12];

// ...заполняем массив attributeTable данными

Mesh->SetAttributeTable(attributeTable, 12);

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz