Accès au contenu d’une mémoire tampon de vertex (Direct3D 9)

Les objets de mémoire tampon de vertex permettent aux applications d’accéder directement à la mémoire allouée pour les données de vertex. Vous pouvez récupérer un pointeur vers la mémoire tampon de vertex en appelant la méthode IDirect3DVertexBuffer9::Lock , puis en accédant à la mémoire en fonction des besoins pour remplir la mémoire tampon avec de nouvelles données de vertex ou lire les données qu’elle contient déjà. La méthode IDirect3DVertexBuffer9::Lock accepte quatre paramètres. Le premier, OffsetToLock, est le décalage dans les données de vertex. Le deuxième paramètre est la taille, mesurée en octets, des données de vertex. Le troisième paramètre accepté est l’adresse d’un pointeur qui pointe vers les données de vertex, si l’appel réussit.

Le dernier paramètre, Indicateurs, indique au système comment la mémoire doit être verrouillée. Spécifiez des constantes pour le paramètre Flags en fonction de la façon dont les données de vertex seront accessibles. Assurez-vous que la valeur choisie pour D3DUSAGE correspond à la valeur choisie pour D3DLOCK. Par exemple, si vous créez une mémoire tampon de vertex avec accès en écriture uniquement, il n’est pas judicieux d’essayer de lire les données en spécifiant D3DLOCK_READONLY. L’utilisation judicieuse de ces indicateurs permet au pilote de verrouiller la mémoire et de fournir les meilleures performances, compte tenu du type d’accès demandé.

Une fois que vous avez terminé de remplir ou de lire les données de vertex, appelez la méthode IDirect3DVertexBuffer9::Unlock , comme indiqué dans l’exemple de code suivant.

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

Si vous créez une mémoire tampon de vertex avec l’indicateur D3DUSAGE_WRITEONLY, n’utilisez pas l’indicateur de verrouillage D3DLOCK_READONLY. Utilisez l’indicateur D3DLOCK_READONLY si votre application lit uniquement à partir de la mémoire tampon du vertex. L’inclusion de cet indicateur permet à Direct3D d’optimiser ses procédures internes pour améliorer l’efficacité, étant donné que l’accès à la mémoire sera en lecture seule.

Pour plus d’informations sur l’utilisation de D3DLOCK_DISCARD ou de D3DLOCK_NOOVERWRITE pour le paramètre Flags de IDirect3DVertexBuffer9::Lock, consultez Utilisation de tampons dynamiques de vertex et d’index.

En C++, étant donné que vous accédez directement à la mémoire allouée pour la mémoire tampon de vertex, assurez-vous que votre application accède correctement à la mémoire allouée. Sinon, vous risquez de rendre cette mémoire non valide. Utilisez la foulée du format de vertex utilisé par votre application pour passer d’un sommet dans la mémoire tampon allouée à un autre. La mémoire tampon de vertex est un tableau simple de sommets spécifiés dans FVF. Utilisez la foulée de la structure de format de vertex que vous définissez. Vous pouvez calculer la foulée de chaque sommet au moment de l’exécution en examinant la valeur D3DFVF contenue dans la description de la mémoire tampon de vertex. Le tableau suivant indique la taille de chaque composant de vertex.

Indicateur de format de vertex Taille
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

 

Le nombre de coordonnées de texture présentes dans le format de vertex est décrit par les D3DFVF_TEX n indicateurs (où n est une valeur comprise entre 0 et 8). Multipliez le nombre d’ensembles de coordonnées de texture par la taille d’un ensemble de coordonnées de texture, qui peut aller de un à quatre floats, pour calculer la mémoire requise pour ce nombre de coordonnées de texture.

Utilisez la foulée de vertex total pour incrémenter et décrémenter le pointeur de mémoire en fonction des besoins pour accéder à des sommets particuliers.

Récupération des descriptions des tampons de vertex

Vous pouvez récupérer des informations sur une mémoire tampon de vertex en appelant la méthode IDirect3DVertexBuffer9::GetDesc . Cette méthode remplit les membres de la structure D3DVERTEXBUFFER_DESC avec des informations sur la mémoire tampon de vertex.

Mémoires tampons de vertex