2017-02-14 3 views
1

Disons que je crée deux tampons de vertex, pour deux maillages différents. Maintenant, disons que je veux dessiner l'un des maillages en utilisant un tampon d'index. En regardant le livre Pratique Rendu et Calcul avec Direct3D 11 Il ne semble pas que la création d'un tampon d'index fasse référence à un tampon de vertex, alors comment le tampon d'index sait-il (pendant l'assemblage d'entrée) quel vertex buffer agir ?Utilisation de tampons d'index dans DirectX 11; comment le sait-il?

J'ai fait quelques recherches sans réponses, ce qui m'amène à penser qu'il y a quelque chose d'évident à ce sujet qui me manque.

Répondre

2

Vous avez raison, les tampons d'index ne font pas référence à des tampons de vertex spécifiques. Pendant DrawIndexed le tampon d'index actif est utilisé pour fournir des index dans des buffers de vertex actifs (ceux que vous avez définis en utilisant SetIndexBuffer/SetVertexBuffers).

+0

D'accord, je n'étais pas au courant de cela. Alors dites-moi, est-ce que ma supposition était correcte en ce sens que vous avez des tampons séparés pour des maillages séparés? Je comprends avoir un seul peut être utile pour certaines mailles telles que les accessoires statiques dans une scène et tel mais en général est-ce une bonne/mauvaise pratique? Y a-t-il des limites quant au nombre de produits que l'on peut/devrait utiliser? –

+1

Vous pouvez organiser vos VB/IB de différentes manières. Le problème clé est que vous devez pouvoir soumettre chaque 'sous-ensemble de maillage' comme un tirage distinct, car les paramètres matériels doivent changer entre les tirages.Vous pouvez même utiliser un VB et un IB pour des niveaux entiers (dans [limitations matérielles] (https://blogs.msdn.microsoft.com/chuckw/2012/06/20/direct3d-feature-levels/)). Si vous êtes nouveau sur DirectX, vous devriez simplement faire ce qui est simple. BTW, jetez un oeil à la [Kit d'outils DirectX] (https://github.com/Microsoft/DirectXTK/wiki/Getting-Started). –

+1

@EliasFinoli La meilleure pratique (depuis le point de performance) est de réduire le nombre d'appels DI, c'est-à-dire grouper les maillages partageant la disposition des sommets, certaines textures et certains shaders en concaténant leur VB/IB et en les appelant en un seul appel. Il n'y a pas de meilleure stratégie générique de traitement par lots, cela dépend de votre scène, des capacités matérielles cibles, etc. Certaines des techniques sont mentionnées [ici] (https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch28.html). – w1ck3dg0ph3r

1

En effet, les tampons d'index et les tampons Vertex sont complètement indépendants.

tampon d'index connaîtra VertexBuffer au moment du tirage au sort (par exemple: lorsque les deux comme liés au pipeline)

Vous pouvez penser Index tampon comme une « table de recherche », où vous gardez un index de liste ou des éléments dessiner. Cela signifie également que vous pouvez attacher deux tampons complètement "non reliés logiquement" au pipeline et le dessiner, rien ne vous empêchera de le faire, mais vous aurez évidemment des résultats visuels étranges.

deux Découplage présente de nombreux avantages, voici quelques exemples:

  • Vous pouvez réutiliser un tampon d'index (par exemple, deux grilles déplacées avec une résolution identique peuvent partager le même tampon d'index). Cela peut être un gain de mémoire décent.
  • Vous pouvez dessiner votre tampon Vertex seul et effectuer un traitement par vertex (dessiner une liste de points pour les sprites par exemple, ou appliquer un skinning/displacement dans un tampon Stream Output, puis dessiner le buffer de vertex résultant en utilisant DrawIndexed)
  • Les deux tampons Vertex/Index peuvent également être liés en tant que ByteAddressBuffer, de sorte que vous pouvez également traiter votre géométrie dans Compute Shader et créer un autre tampon d'index optimisé, avec des triangles triés par exemple, puis traiter le dessin indexé avec le tampon optimisé. L'application de ces révisions avec des indices au lieu de sommets est souvent plus rapide que vertex, car vous déplacerez beaucoup moins de mémoire.
  • Ceci est un cas de niche, mais parfois je dois dessiner un maillage comme un ensemble de triangles, mais ensuite dessiner comme un ensemble de lignes (une forme de fil de fer). Si par exemple, vous prenez une seule boîte, vous ne voudrez pas dessiner les diagonales comme des lignes, donc j'ai un Vertexbuffer partagé avec des sommets de boîte, puis un IndexBuffer dédié pour dessiner une liste de triangles, et un autre pour dessiner une liste de lignes. Dans le cas de grands modèles, cela peut également être un gain de mémoire efficace.