Создание буфера вершин (Direct3D 9)
Объект буфера вершин создается путем вызова метода IDirect3DDevice9::CreateVertexBuffer , который принимает пять параметров. Первый параметр указывает длину буфера вершин в байтах. Используйте оператор sizeof для определения размера формата вершины в байтах. Рассмотрим следующий пользовательский формат вершин.
struct CUSTOMVERTEX {
FLOAT x, y, z;
FLOAT rhw;
DWORD color;
FLOAT tu, tv; // Texture coordinates
};
// Custom flexible vertex format (FVF) describing the custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
Чтобы создать буфер вершин для хранения четырех структур CUSTOMVERTEX, укажите [4*sizeof(CUSTOMVERTEX)] в параметре Length .
Второй параметр — это набор элементов управления использованием. Среди прочего, его значение определяет, способен ли буфер вершин содержать сведения об обрезки ( в виде флагов клипа ) для вершин, которые существуют за пределами области просмотра. Чтобы создать буфер вершин, который не может содержать флаги клипа, включите флаг D3DUSAGE_DONOTCLIP для параметра Usage . Флаг D3DUSAGE_DONOTCLIP применяется только в том случае, если вы также указываете, что буфер вершин будет содержать преобразованные вершины. Флаг D3DFVF_XYZRHW включен в параметр FVF . Метод IDirect3DDevice9::CreateVertexBuffer игнорирует флаг D3DUSAGE_DONOTCLIP, если вы указываете, что буфер будет содержать непередаваемые вершины (флаг D3DFVF_XYZ). Флаги обрезки занимают дополнительную память, что делает буфер вершин с поддержкой обрезки немного больше буфера вершин, который не может содержать флаги обрезки. Так как эти ресурсы выделяются при создании буфера вершин, необходимо заранее запросить буфер вершин с поддержкой обрезки.
Третий параметр, FVF, представляет собой сочетание D3DFVF , описывающее формат вершины буфера вершин. Если для этого параметра задано значение 0, буфер вершин является буфером вершин без FVF. Дополнительные сведения см. в разделе Буферы вершин FVF (Direct3D 9). Четвертый параметр описывает класс памяти, в который помещает буфер вершин.
Последний параметр, который принимает IDirect3DDevice9::CreateVertexBuffer , — это адрес переменной, которая будет заполнена указателем на новый интерфейс IDirect3DVertexBuffer9 объекта буфера вершин, если вызов будет выполнен успешно.
Невозможно создать флаги клипа для буфера вершин, который был создан без поддержки.
В следующем примере кода C++ показано, как в коде может выглядеть создание буфера вершин.
// d3dDevice contains the address of an IDirect3DDevice9 interface
// g_pVB is a variable of type LPDIRECT3DVERTEXBUFFER9
// The custom vertex type
struct CUSTOMVERTEX {
FLOAT x, y, z;
FLOAT rhw;
DWORD color;
FLOAT tu, tv; // The texture coordinates
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
// Create a clipping-capable vertex buffer. Allocate enough memory
// in the default memory pool to hold three CUSTOMVERTEX
// structures
if( FAILED( d3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0 /*Usage*/, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
return E_FAIL;
Связанные темы