Чтобы увидеть куб нужно либо подкорректировать координаты куба, либо изменить положение камеры, то есть точки из которой и куда мы будем смотреть на мир

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 {


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: