0);
D3DPOOL_DEFAULT,
D3DFMT_INDEX16,
0,
D3DPOOL Pool,
D3DFORMAT Format,
DWORD Usage,
UINT Length,
HRESULT CreateIndexBuffer(
20,21,22,22,21,23,
16,17,18,18,17,19,
12,13,14,14,13,15,
8,9,10,10,9,11,
4,5, 6, 6,5,7,
0,1,2,2,1,3,
};
Для удобства восприятия, в примере в каждой строке записано по 6 индексов, которые описывают два треугольника или одну грань.
Для хранения индексов применяется специальный индексный буфер. Работа сним схожа на работу сбуфером вершин.
При работе с индексным буфером его сначала необходимо создать с помощью метода CreateIndexBuffer интерфейса iDirect3DDevice9. Этот метод выглядит следующим образом:
IDirect3DIndexBuffer9** ppIndexBuffer,
HANDLE* pHandle
);
Рассмотрим параметры этого метода:
□ Length — необходимая длина буфера. В нашем случае длина будет равна количеству индексов, умноженному на размер каждого, а размер индекса равен размеру целого числа short;
□ usage — параметры использования. В данном случае ничего указывать не будем. Поскольку в буфер мы намереваемся только писать, поэтому можно было бы указать параметр D3DUSAGE_WRITEONLY, который мы уже видели при рассмотрении создания буфера вершин;
|
|
□ Format — формат индекса или размер каждого элемента массива. В нашем случае индексы описаны числами short (16 бит), а значит, в этом параметре нужно указать флаг D3DFMT_INDEX16. Если бы элементы массива были типа int (32 бита), то тогда в этом параметре надо было указывать D3DFMT_INDEX32;
□ Pool — флаг. Возможные значения этого параметра идентичны одноименному параметру метода CreateVortexBuffer;
□ ppIndexBuffer— указатель на переменную, которая будет указывать на созданный интерфейс буфера индексов;
□ pHandle — не используется и должен быть равен нулю.
Создание буфера индексов:
hRes = pD3DDevice->CreateIndexBuffer(
sizeof(short) * ildxNum,
&iBuffer,
Для заполнения индексного буфера необходимо:
1) заблокировать буфер;
2) заполнить буфер индексов;
3) освободить буфер индексов.
Для блокировки используется метод Lock интерфейса iDirect3DindexBuffer9. Параметры этого метода идентичны одноименному из интерфейса iDirect3DVertexBuffer9. Логика использования также идентична.
Точка просмотра
Наш куб находится в координатах от -0,5 до +0,5 по всем осям, т. е. центр расположен в нулевой точке.
После инициализации Direct3D, в качестве матрицы вида используется единичная матрица (если не задана другая), при которой текущее положение камеры находится также в нулевой точке. Это значит, что мы будем смотреть на мир из центра куба и ничего, кроме невидимых сторон этого куба, не увидим, а невидимые стороны белые, поэтому и сцена окажется пустой.
|
|
Любая матрица в Direct3D – это массив, например размером 4x4. Массив будет выглядеть следующим образом:
А11 | А12 | А13 | А14 |
А21 | А22 | А23 | А24 |
А31 | А32 | А33 | А34 |
А41 | А42 | А43 | А44 |
В Direct3D матрица вида объявлена как D3DMATRIX и имеет следующий вид:
typedef struct _D3DMATRIX {
union {
struct {