Pourquoi les objets tampons Vertex améliorent-ils les performances?

10

D'après ma compréhension de base, un objet tampon Vertex fonctionne comme ceci (pseudo-code):

Normalement, si l'on voulait dire dessiner un carré, on pourrait émettre des commandes de dessin au trait.

line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)

Utiliser un VBO, si je comprends bien, chargerait les sommets dans un VBO.

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO

Ensuite, vous pouvez émettre une commande de dessin.

draw VBO vertices

Bien que je comprenne comment fonctionnent les VBO, je ne sais pas pourquoi ils améliorent les performances.

Comment améliorent-ils les performances?

Ethan Bierlein
la source

Réponses:

11

En général, lorsque vous effectuez le rendu d'un objet en mode immédiat (en émettant des commandes de dessin au trait par exemple), vous créez une série de commandes que vous soumettez à la carte graphique pour dessiner. Si vous dessinez beaucoup de données, ou dessinez très fréquemment, vous pouvez perdre beaucoup de temps à envoyer ces données encore et encore.

Un tampon de vertex vous permet de produire un seul objet que vous soumettez à la carte graphique une fois. Si vous n'avez pas besoin de modifier votre géométrie, vous pouvez la laisser sur la carte graphique et simplement envoyer à la carte graphique une demande pour dessiner cet objet. Puisqu'il évite la copie chaque fois que vous dessinez, il y a beaucoup moins de frais généraux pour chaque tirage.

Notez que l'utilisation d'un objet tampon de vertex ne fournit pas toujours une accélération très significative. Si vous ne dessinez l'objet qu'une fois par image et que vous remplacez la géométrie entre chaque image, vous n'obtenez pas les avantages d'éviter de copier chaque image.

La majeure partie de mon expérience vient de l'écriture de programmes utilisant des API graphiques comme OpenGL, donc quelqu'un qui s'est fâché avec le backend d'un pilote graphique peut probablement fournir une réponse plus détaillée, mais j'espère que cela rend les choses un peu plus claires.

porglezomp
la source
10

Il y a deux étapes qui rendent le VBO plus efficace que le mode immédiat.

  1. Le mode immédiat ( glBegin / glEnd , glVertex * , etc.) signifie qu'à chaque image, vous alimentez les sommets, attribut par attribut (position, normal, couleur, etc.) à chaque image, vers le pilote, qui les reformate ensuite et envoie enfin l'ensemble du package en tant que commande du GPU. Que beaucoup de fonctions appellent par sommet sur chaque image.
    (Notez que le mode immédiat est obsolète depuis OpenGL 3.0 et est entièrement supprimé de 3.2 .)

  2. En utilisant des tableaux de sommets (voir glDrawArrays , glDrawElements , glVertexPointer , etc.), vous pouvez donner au pilote le tout à la fois et lui épargner le fardeau du reformatage des sommets. Vous remplacez effectivement plusieurs appels de fonction par sommet par seulement une poignée d'appels pour le maillage entier. Mais vous devez toujours le faire une fois par image.

  3. Vertex Buffer Object , ou VBO (voir glGenBuffers , glBindBuffer , etc.) aller plus loin et stocker les données côté GPU: vous ne les envoyez qu'une seule fois, puis vous vous y référez simplement par une poignée. Vous économisez de la bande passante en n'envoyant pas les mêmes données à chaque trame.

Julien Guertault
la source
6

En utilisant une interface en mode immédiat (par exemple, l'ancien style OpenGL glBegin () / glEnd () / glVertex ()), vous transférez efficacement les données au pilote une pièce à la fois. Il doit ensuite prendre cette seule donnée, la reformater et la transmettre au matériel (ce qui signifie de nos jours la mettre dans un tampon de commande).

En utilisant un objet tampon de vertex, vous fournissez un bloc de données volumineux (espérons-le) au pilote avant qu'il ne doive être utilisé. Il peut effectuer un certain nombre d'optimisations (reformater, placer dans la mémoire vidéo) ainsi que ne pas avoir à alimenter le GPU au coup par coup.

En pratique, si vous ne dessinez qu'un petit nombre de primitives, cela ne fera probablement pas beaucoup de différence, mais si vous dessinez un maillage de plusieurs millions de triangles, les VBO en mémoire vidéo sont la solution.

Andrew Sidwell
la source