Freigeben über


Erstellen eines Vertexpuffers (Direct3D 9)

Sie erstellen ein Vertexpufferobjekt, indem Sie die IDirect3DDevice9::CreateVertexBuffer-Methode aufrufen, die fünf Parameter akzeptiert. Der erste Parameter gibt die Länge des Vertexpuffers in Bytes an. Verwenden Sie den sizeof-Operator, um die Größe eines Vertexformats in Bytes zu bestimmen. Betrachten Sie das folgende benutzerdefinierte Vertexformat.

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)

Um einen Vertexpuffer für vier CUSTOMVERTEX-Strukturen zu erstellen, geben Sie [4*sizeof(CUSTOMVERTEX)] für den Length-Parameter an.

Der zweite Parameter ist ein Satz von Verwendungssteuerelementen. Sein Wert bestimmt unter anderem, ob der Vertexpuffer Beschneidungsinformationen - in Form von Clipflags - für Scheitelpunkte enthalten kann, die außerhalb des Anzeigebereichs vorhanden sind. Um einen Vertexpuffer zu erstellen, der keine Clipflags enthalten kann, schließen Sie das D3DUSAGE_DONOTCLIP-Flag für den Usage-Parameter ein. Das flag D3DUSAGE_DONOTCLIP wird nur angewendet, wenn Sie auch angeben, dass der Vertexpuffer transformierte Scheitelpunkte enthält. Das flag D3DFVF_XYZRHW ist im FVF-Parameter enthalten. Die IDirect3DDevice9::CreateVertexBuffer-Methode ignoriert das D3DUSAGE_DONOTCLIP-Flag, wenn Sie angeben, dass der Puffer nicht übersetzte Scheitelpunkte (das D3DFVF_XYZ-Flag) enthält. Beschneidungsflags belegen zusätzlichen Arbeitsspeicher, sodass ein clippingfähiger Vertexpuffer etwas größer ist als ein Vertexpuffer, der keine Clippingflags enthält. Da diese Ressourcen beim Erstellen des Vertexpuffers zugeordnet werden, müssen Sie im Voraus einen clippingfähigen Vertexpuffer anfordern.

Der dritte Parameter, FVF, ist eine Kombination aus D3DFVF , die das Vertexformat des Vertexpuffers beschreibt. Wenn Sie für diesen Parameter 0 angeben, ist der Vertexpuffer ein Nicht-FVF-Vertexpuffer. Weitere Informationen finden Sie unter FVF-Vertexpuffer (Direct3D 9). Der vierte Parameter beschreibt die Speicherklasse, in der der Vertexpuffer platziert werden soll.

Der letzte Parameter, den IDirect3DDevice9::CreateVertexBuffer akzeptiert, ist die Adresse einer Variablen, die mit einem Zeiger auf die neue IDirect3DVertexBuffer9-Schnittstelle des Vertexpufferobjekts gefüllt wird, wenn der Aufruf erfolgreich ist.

Sie können keine Clipflags für einen Vertexpuffer erstellen, der ohne Unterstützung erstellt wurde.

Das folgende C++-Codebeispiel zeigt, wie das Erstellen eines Vertexpuffers im Code aussehen kann.

   
// 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;

Vertexpuffer