После инициализации должна вызываться функция, которая будет инициализировать все необходимое для создания куба. Назовем эту функцию 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();
}