Zugreifen auf den Inhalt eines Vertexpuffers (Direct3D 9)

Vertexpufferobjekte ermöglichen Es Anwendungen, direkt auf den Für Scheitelpunktdaten zugeordneten Arbeitsspeicher zuzugreifen. Sie können einen Zeiger auf den Vertexpufferspeicher abrufen, indem Sie die IDirect3DVertexBuffer9::Lock-Methode aufrufen und dann bei Bedarf auf den Speicher zugreifen, um den Puffer mit neuen Vertexdaten zu füllen oder bereits enthaltene Daten zu lesen. Die IDirect3DVertexBuffer9::Lock-Methode akzeptiert vier Parameter. Die erste , OffsetToLock, ist der Offset in die Vertexdaten. Der zweite Parameter ist die In Bytes gemessene Größe der Vertexdaten. Der dritte akzeptierte Parameter ist die Adresse eines Zeigers, der auf die Vertexdaten zeigt, wenn der Aufruf erfolgreich ist.

Der letzte Parameter Flags teilt dem System mit, wie der Speicher gesperrt werden soll. Geben Sie Konstanten für den Flags-Parameter entsprechend der Art und Weise an, wie auf die Vertexdaten zugegriffen wird. Stellen Sie sicher, dass der für D3DUSAGE ausgewählte Wert mit dem für D3DLOCK ausgewählten Wert übereinstimmt. Wenn Sie beispielsweise einen Vertexpuffer nur mit Schreibzugriff erstellen, ist es nicht sinnvoll, die Daten zu lesen, indem Sie D3DLOCK_READONLY angeben. Die sinnvolle Verwendung dieser Flags ermöglicht es dem Treiber, den Speicher zu sperren und die beste Leistung zu erzielen, wenn der angeforderte Zugriffstyp verwendet wird.

Nachdem Sie das Ausfüllen oder Lesen der Vertexdaten abgeschlossen haben, rufen Sie die IDirect3DVertexBuffer9::Unlock-Methode auf, wie im folgenden Codebeispiel gezeigt.

// This code example assumes the g_pVB is a variable of type 
//   LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been  
//   properly initialized with vertices

// Lock the buffer to gain access to the vertices 
VOID* pVertices;

if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices), 
        (BYTE**)&pVertices, 0 ) ) ) 
    return E_FAIL;

memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock();

Wenn Sie einen Vertexpuffer mit dem D3DUSAGE_WRITEONLY-Flag erstellen, verwenden Sie nicht das D3DLOCK_READONLY Sperrenflag. Verwenden Sie das D3DLOCK_READONLY-Flag, wenn Ihre Anwendung nur aus dem Vertexpufferspeicher liest. Durch das Einschließen dieses Flags kann Direct3D seine internen Prozeduren optimieren, um die Effizienz zu verbessern, da der Zugriff auf den Arbeitsspeicher schreibgeschützt ist.

Informationen zur Verwendung von D3DLOCK_DISCARD oder D3DLOCK_NOOVERWRITE für den Flags-Parameter von IDirect3DVertexBuffer9::Lock finden Sie unter Verwenden dynamischer Vertex- und Indexpuffer.

Stellen Sie in C++ sicher, dass Ihre Anwendung ordnungsgemäß auf den zugewiesenen Speicher für den Vertexpuffer zugreift, da Sie direkt auf den zugeordneten Speicher zugreifen. Andernfalls besteht das Risiko, dass dieser Arbeitsspeicher ungültig wird. Verwenden Sie die Stride des Scheitelpunktformats, das Ihre Anwendung verwendet, um von einem Scheitelpunkt im zugeordneten Puffer zu einem anderen zu wechseln. Der Vertexpufferspeicher ist ein einfaches Array von Scheitelpunkten, die in FVF angegeben sind. Verwenden Sie die Stride der von Ihnen definierten Struktur des Scheitelpunktformats. Sie können die Stride jedes Scheitelpunkts zur Laufzeit berechnen, indem Sie die in der Vertexpufferbeschreibung enthaltene D3DFVF untersuchen. Die folgende Tabelle zeigt die Größe für jede Vertexkomponente.

Vertexformatflag Size
D3DFVF_DIFFUSE sizeof(DWORD)
D3DFVF_NORMAL sizeof(float) x 3
D3DFVF_SPECULAR sizeof(DWORD)
D3DFVF_TEXn sizeof(float) x n
D3DFVF_XYZ sizeof(float) x 3
D3DFVF_XYZRHW sizeof(float) x 4

 

Die Anzahl der Texturkoordinaten im Vertexformat wird durch die D3DFVF_TEX n-Flags (wobei n ein Wert von 0 bis 8 ist) beschrieben. Multiplizieren Sie die Anzahl der Texturkoordinatensätze mit der Größe eines Texturkoordinatensatzes, der zwischen 1 und vier Floats liegen kann, um den für diese Anzahl von Texturkoordinaten erforderlichen Arbeitsspeicher zu berechnen.

Verwenden Sie den gesamten Scheitelpunktschritt, um den Speicherzeiger nach Bedarf für den Zugriff auf bestimmte Scheitelpunkte zu inkrementieren und zu verringern.

Abrufen von Vertexpufferbeschreibungen

Sie können Informationen zu einem Vertexpuffer abrufen, indem Sie die IDirect3DVertexBuffer9::GetDesc-Methode aufrufen. Diese Methode füllt die Member der D3DVERTEXBUFFER_DESC-Struktur mit Informationen über den Vertexpuffer.

Vertexpuffer