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, а последний — флаги, которые мы не используем.