DWORD Flags

UINT SizeToLock,

UINT OffsetToLock,

HRESULT Lock(

0);

D3DPOOL_DEFAULT,

D3DUSAGE_WRITEONLY,

PHandle — не используется и должен быть равен нулю.

D3DPOOL Pool,

DWORD FVF,

DWORD Usage,

UINT Length,

HRESULT CreateVertexBuffer(

Буфер вершин

В Direct3D для хранения вершин применяется специальный буфер. Чтобы отобразить фигуру, необходимо заполнить буфер вершинами и указать, какие примитивы будут использоваться и в какой последовательности строить фигуру.

Для создания буфера вершин используется метод CreateVertexBuffer, который выглядит следующим образом:

IDirect3DVertexBuffer9** ppVertexBuffer,

HANDLE* pHandle

);

Здесь имеются следующие параметры:

1) Length — длина буфера в байтах. Параметр используется для буферов вершин формата Flexible Vertex Format (FVF, гибкий формат вершин);

2) Usage — флаги, которые определяют, как будет использоваться буфер. Будем использовать флаг D3DUSAGE_WRITEONLY, который означает, что буфер будет применяться только для записи, т. е. сформировали точки буфера, записали и не читаем из буфера. Это позволит Direct3D оптимизировать память для лучшего использования и формирования сцены;

3) FVF — по флагам этого параметра Direct3D определяет, как выглядит описание каждой точки. В нашем случае это координаты и цвет. Такого флага нет, но можно указать сразу два флага:

D3DFVF_XYZ — точка описывается координатами X, Y и Z;

D3DFVF_DIFFUSE — в описании точки указан рассеянный цвет;


4) Pool — флаг, определяющий, где должен быть расположен буфер. Здесь можно указать одно из следующих значений:

• D3DPOOL_DEFAULT — определяется системой по умолчанию;

D3DPOOL_MANAGED — при необходимости происходит автоматическое копирование буфера в память, доступную аппаратной части, и автоматически резервируется в системной памяти, а значит, не сможет произойти потери памяти;

D3DPOOL_SYSTEMMEM — использовать системную память;

• D3DPOOL SCRATCH — использовать системную память, но при этом, устройство не может обратиться к этой памяти;

• D3DPOOL_FORCE_DWORD — не используется;

5) ppvertexBuffer — указатель на буфер с вершинами;

Посмотрим, с какими параметрами и как мы вызываем этот метод в нашем примере:

HRESULT hRes = pD3DDevice->CreateVertexBuffer(

sizeof(sVertex) * iVertsNum,

D3DFVF_XYZ | D3DFVF_DIFFUSE,

&vBuffer,


Работа с буфером вершин

При заполнении буфера вершин сначала его необходимо заблокировать с помощью метода Lock, заполнить буфер значениями вершин и затем разблокировать его.

Метод Lock выглядит следующим образом:

VOID **ppbData,

);

Здесь имеются следующие четыре параметра:

□ offsetToLock— смещение от начала буфера, откуда нужно блокировать данные;

□ sizeToLock — размер блокируемых данных;

□ **ppbData — указатель на буфер, где хранятся данные буфера вершин;

□ Flags — флаги.

1) Блокировка в программе происходит следующим образом:

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

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


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



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