bonjour,
j'écris un système de particules dans lequel
j'utilise DrawIndexedInstanced() pour le rendu d'instances de quad
j'ai donc un VB avec les vertices du quad, et un autre pour les matrices d'instances
j'ai plusieurs questions :
quand on copie dans le vertex buffer les matrices d'instances des quad
le tableau de matrices d'instances associé à pSrcMatrices doit être défini avec des directives #pragma d'alignement en mémoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 D3DXMATRIX* pDestMatrices = NULL; D3DXMATRIX* pScrMatrices = m_pMatrixInstanceList; // tableau d'instances interne calculé dans UpdateInstancedMatrix() m_pParticleInstanceData->Map( D3D10_MAP_WRITE_DISCARD, NULL, ( void** )&pDestMatrices ); memcpy( pDestMatrices, pScrMatrices, uiNumInstances * sizeof( D3DXMATRIX ) ); m_pParticleInstanceData->Unmap();
comme dans l'exmple Instancing10
donc je déclare le tableau de matrices d'instances avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #pragma pack(push, 1) struct INSTANCEDATA { D3DXMATRIX mMatWorld; float fOcc; }; #pragma pack(pop)
sinon on obtient des erreurs au niveau du shader
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // #pragma empêche compression en mémoire, donc changement d'alignement des matrices en RAM, sinon problème de shader #define MAX_PARTICLES 8192 // nombre maximal de particules #pragma pack(push, 1) D3DXMATRIX g_pMatrixArrayList[ MAX_PARTICLES ]; #pragma pack(pop)
est ce bien vrai ?
puis je encapsuler la déclaration du tableau dans ma classe avec les directives d'alignement en RAM ?
j'utilise un CGrowableArray pour stocker mes particules, puis, je copie les matrices associées dans un tableau à taille fixe,
déclaré aligné en RAM, puis je passe un pointeur vers ce tableau lors de la copie des matrices d'instances vers le vb dynamique
pour faire mon rendu avec DrawIndexedInstanced()
je dois pouvoir m'y prendre différemment, la taille fixe des tableaux est elle nécessaire ?
lorsque je change le nombre d'instances à rendre dans DrawIndexedInstanced() d'une frame à l'autre, j'obtiens un warning
ais je intérêt à créer des ressources et à utiliser CopySubresourceRegion() , plutôt que Map() pour les copies de données ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 D3D10: WARNING: ID3D10Device::DrawIndexedInstanced: Vertex Buffer at the input vertex slot 1 is not big enough for what the Draw*() call expects to traverse.
pourquoi l'utilisation de DXMATRIXA16 en place de D3DXMATRIX ne solutionne pas le problème ?
quelqu'un peut il m'éclairer un peu sur tout ça ?
Partager