Tworzenie buforu wierzchołka (Direct3D 9)
Obiekt buforu wierzchołka jest tworzony przez wywołanie metody IDirect3DDevice9::CreateVertexBuffer, która akceptuje pięć parametrów. Pierwszy parametr określa długość buforu wierzchołka w bajtach. Użyj operatora sizeof, aby określić rozmiar formatu wierzchołka w bajtach. Rozważmy następujący niestandardowy format wierzchołka.
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)
Aby utworzyć bufor wierzchołka do przechowywania czterech struktur CUSTOMVERTEX, określ parametr [4*sizeof(CUSTOMVERTEX)] dla parametru długości.
Drugi parametr to zestaw kontrolek użycia. Między innymi jego wartość określa, czy bufor wierzchołka może zawierać informacje o obcięciu - w postaci flag obcięcia - dla wierzchołków, które istnieją poza obszarem widzenia. Aby utworzyć bufor wierzchołka, który nie może zawierać flag klipów, dołącz flagę D3DUSAGE_DONOTCLIP dla parametru Usage. Flaga D3DUSAGE_DONOTCLIP jest stosowana tylko wtedy, gdy wskazujesz również, że bufor wierzchołków będzie zawierać przekształcone wierzchołki — flaga D3DFVF_XYZRHW jest uwzględniona w parametrze FVF. Metoda IDirect3DDevice9::CreateVertexBuffer ignoruje flagę D3DUSAGE_DONOTCLIP, jeśli wskazujesz, że bufor będzie zawierać nieprzetłumaczone wierzchołki (flaga D3DFVF_XYZ). Flagi wycinków zajmują dodatkową pamięć, co powoduje, że bufor wierzchołka z obsługą wycinków jest nieco większy niż bufor wierzchołka, który nie obsługuje flag wycinków. Ponieważ te zasoby są przydzielane podczas tworzenia buforu wierzchołków, z wyprzedzeniem należy zażądać buforu wierzchołków obsługującego przycinanie.
Trzeci parametr, FVF, jest kombinacją D3DFVF, które opisują format wierzchołków bufora wierzchołkowego. Jeśli określisz wartość 0 dla tego parametru, bufor wierzchołka jest buforem wierzchołka bez FVF. Aby uzyskać więcej informacji, zobacz bufory wierzchołków FVF (Direct3D 9). Czwarty parametr opisuje klasę pamięci, w której ma być umieszczany bufor wierzchołka.
Ostatni parametr, który akceptuje IDirect3DDevice9::CreateVertexBuffer, to adres zmiennej, która zostanie wypełniona wskaźnikiem do nowego interfejsu IDirect3DVertexBuffer9 obiektu bufora wierzchołków, jeśli wywołanie zakończy się sukcesem.
Nie można utworzyć flag przycięcia dla buforu wierzchołków, który został utworzony bez ich obsługi.
Poniższy przykład kodu C++ pokazuje, jak może wyglądać tworzenie buforu wierzchołka w kodzie.
// 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;
Tematy pokrewne