|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
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 Code :
comme dans l'exmple Instancing10 Code :
Code :
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 Code :
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 ? |
||||||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : février 2006 Messages : 1 391 ![]() |
effectivement pour les vb, il faut que les données soient contigus en mémoire.
pour ma part, j'utilise souvent un vector pour stocker mes éléments du vb, le vector garantissant la continuité en mémoire des éléments stockés, mais j'ai jamais vraiment porté plus d'attention à ça. concernant CopySubresourceRegion() et Map(), je dirai c'est selon XD et pour DXMATRIXA16 ça créé une matrice aligné certes, mais est ce que les conteneurs de DXMATRIXA16 seront alignés, ça je doute. |
|
|
00
|
|
|
#3 | ||||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
aprés des tests sur l'exemple "Instancing10",
le fait de désactiver la directive #pragma ne semble pas provoquer de problèmes particulier ! Code :
si je comprends bien D3DXMATRIXA16 n'aligne en mémoire que le contenu de la matrice et non pas la variable matrice elle même ? dans l'exemple "Instanging10" du SDK, lorsque je modifie le nombre d'instance des arbres à rendre via ler slider d'interface, j'obtiens un warning Code :
et j'ai le même problème lorsque je veux augmenter le nombre d'instances à rendre lors du "DrawIndexedInstanced(..)" dans mon programme Est ce qu'on peut modifier le nombre d'instances à rendre sans problème ? L'exemple du SDK fonctionne outre les warning ? faut t-il impérativement utiliser un tableau à taille fixe, lors du passage des instances à rendre au shader avec DrawIndexedInstanced(..)" ? |
||||
|
|
00
|
|
|
#4 | ||||||||
|
Membre Expert
![]() ![]() Inscription : février 2006 Messages : 1 391 ![]() |
Citation:
c'est vrai que sans ces directives ça marche aussi, mais rien ne nous garanti que l'assertion juste au dessus sera valable quelque soit le compilateur ou le type de processeur cible (x86, x64, ia64). l'ajout des pragma nous assurent qu'il y aura pas de padding ajouté à la structure. Citation:
Citation:
donc je suis en train de chercher pourquoi. Citation:
comme je l'ai dit, j'utilise souvent un vector sans visiblement de soucis particulier. |
||||||||
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
merci pour toute ces réponses, ça me fait avancer
je vais tester l'utilisation de vector3<..> 15 octets ? à quel buffer tu les rajoutes ? |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : février 2006 Messages : 1 391 ![]() |
dans la fonction HRESULT LoadInstanceData( ID3D10Device* pd3dDevice, ID3D10Buffer** ppInstanceData, DWORD* pdwNumLeaves, LPCTSTR szFileName )
Code :
|
||
|
|
00
|
|
|
#7 | ||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
dans le create device
Code :
soit 2497*DWORD, cà n'est pas aligné en nombre d'instances ? |
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : février 2006 Messages : 1 391 ![]() |
heu ... je ne comprends pas ce que tu veux dire.
|
|
|
00
|
|
|
#9 | ||||||||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
ajouter des octets à la taille , ou au nombre des instances ne change rien pour moi, il y a toujours erreur
sizeof(INSTANCEDATA) = 68 octets = 16 float de matrice + 1 float = 17*4 2497 instances * 68 = 169796, la taille du buffer d'instances, qui n'a pas besoin d'être aligné, excuse moi peut être que le problème vient du shader qui s'attend à avoir un nombre fixe d'instances le message d'erreur met en cause la taille buffer fournie Code :
Code :
Code :
Code :
|
||||||||
|
|
00
|
|
|
#10 | ||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
j'ai donc continué sur le sujet
et pour le système de particules, j'utilise un CGrowableArray pour mes particules et deux tableaux à taille fixe, ( que je recréé en cas de changment de nombre max ) un pour mes matrices d'instances, un pour les indices associés que je passe à par de warning type Code :
je ne vois toujours pourquoi dans l'exemple Instancing10 du SDK, il y a ce warning avec plus d'un arbre instancié un rapport avec le GPU ? des idées ? |
||
|
|
00
|
|
|
#11 | ||
|
Membre régulier
![]() Inscription : mars 2006 Messages : 141 ![]() |
vu que le warning se trouve dans l'exemple Instancing10 du SDK,
Code :
je vais le considérer comme sans motif, à défaut d'autre solution |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com