Описание фигуры

После инициализации должна вызываться функция, которая будет инициализировать все необходимое для создания куба. Назовем эту функцию CreateQuad и вызовем ее после инициализации Direct3D. Функция показана ниже в листинге.

Параметры этого метода.

HWND hDestWindowOverride,

HRESULT Present (

CONST RECT *pSourceRect,

CONST RECT *pDestRect,

CONST RGNDATA *pDirtyRegion

);

pSourceRect — область копирования. Параметр должен быть равен нулю, если вы не использовали во время создания тип переключения поверхностей D3DSWAPEFFECT_COPY. Если указан — 0, то копироваться будет вся поверхность отображения;

pDestRect— область приемника, куда нужно скопировать данные. Этот параметр также должен быть равен нулю, если во время создания интерфейса IDirect3D не использовался параметр D3DSWAPEFFECT_COPY;

hDestWindowOverride — указатель на окно, где нужно отобразить сцену;

pDirtyRegion— прямоугольники определяют минимальный набор пикселов, которые должны быть обновлены. Остальная часть сцены не обновляется. Параметр используется, только если при создании применялся параметр D3DSWAPEFFECT_CОPY.

При полноэкранном режиме лучше все параметры оставить равными нулю, т. е.:

pD3DDevice->Present(NULL, NULL, 0, NULL);


Примитивы Direct3D

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

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

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

1) Так как функцию инициализации мы уже написала (прошлая лекция), то для инициализации Direct3D достаточно будет вызвать только одну функцию DX3DInit.


void CreateQuad()

{

const sVertex svVortexList[] = {

-0.5f, -0.5f, -0.5f, 0x00ff0000,

-0.5f, 0.5f, -0.5f, 0x00ff0000,

0.5f, -0.5f, -0.5f, 0x00ff0000,

0.5f, 0.5f, -0.5f, 0x00ff0000,

0.5f, -0.5f, -0.5f, 0x0000ff00,

0.5f, 0.5f, -0.5f, 0x0000ff00,

0.5f, -0.5f, 0.5f, 0x0000ff00,

0.5f, 0.5f, 0.5f, 0x0000ff00,

0.5f, -0.5f, 0.5f, 0x000000ff,

0.5f, 0.5f, 0.5f, 0x000000ff,

-0.5f, -0.5f, 0.5f, 0x000000ff,

-0.5f, 0.5f, 0.5f, 0x000000ff,

-0.5f, -0.5f, 0.5f, 0x00ffff00,

-0.5f, 0.5f, 0.5f, 0x00ffff00,

-0.5f, -0.5f, -0.5f, 0x00ffff00,

-0.5f, 0.5f, -0.5f, 0x00ffff00,

-0.5f, 0.5f, -0.5f, 0x0000ffff,

-0.5f, 0.5f, 0.5f, 0x0000ffff,

0.5f, 0.5f, -0.5f, 0x0000ffff,

0.5f, 0.5f, 0.5f, 0x0000ffff,

0.5f, -0.5f, -0.5f, 0x00ff00ff,

0.5f, -0.5f, 0.5f, 0x00ff00ff,

-0.5f, -0.5f, -0.5f, 0x00ff00ff,

-0.5f, -0.5f, 0.5f, 0x00ff00ff,

};

void * pBuf;

// Создание буфера вершин

HRESULT hRes = pD3DDevice->CreateVertexBuffer(sizeof(sVertex) * iVertsNum, D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &vBuffer, 0);

if (FAILED(hRes))

return;

// Блокировка буфера вершин и заполнение вершинного буфера

hRes = vBuffer->Lock(0, sizeof(sVertex) * iVertsNum, &pBuf, 0);

if (FAILED(hRes))

return;

memcpy(pBuf, svVortexList, sizeof(sVertex) * iVertsNum);

vBuffer->Unlock();

// Массив индексов построения треугольника

const unsigned short Idxes[]={

0,1,2,2,1,3,

4,5,6,6,5,7,

8,9,10,10,9,11,

12,13,14,14,13,15,

16,17,18,18,17,19,

20,21,22,22,21,23,

};

// создание индексного буфера

hRes = pD3DDevice->CreateIndexBuffer(sizeof(short) * iIdxNum,

D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&iBuffer, 0);

if (FAILED(hRes))

return;

// Блокировка буфера индексов и заполнение индексного буфера

hRes = iBuffer->Lock(0, sizeof(short) * iIdxNum, &pBuf, 0);

if (FAILED(hRes))

return;

memcpy(pBuf, Idxes, sizeof(short) * iIdxNum);

iBuffer->Unlock();

}



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



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