2015-09-08 2 views
0

Disons que j'ai des centaines de rectangles sur ma scène. Chacun d'eux est en train de changer chaque image:Mettre à jour VBO ou utiliser des uniformes?

  • ils se déplacent sur scène, ils tournent, à l'échelle vers le haut/bas
  • change de couleur de sommets et doit être combiné avec la couleur de la texture
  • textures coordonne les changements, car ce sont des animations 2D

Comment dois-je faire pour obtenir les meilleures performances? Il y a mes idées. S'il vous plaît aidez-moi à choisir ce qui est le meilleur d'entre eux ou suggère quelque chose d'autre:

  • mise à jour VBO chaque image
  • font plus de sommets que le besoin (par exemple: stocker toutes les images d'animation en VBO) et choisissez qui est rendu (appel glDrawElements plusieurs fois)
  • envoi modifier des données via des uniformes et recalculées dans vertex shader au lieu de CPU

La question principale est en fait: quelles fonctions puis-je appeler autant de fois que je veux et que je devrais éviter d'appeler plus que peu de temps par boucle principale?

+0

VBO? tu veux dire VAO? Dans votre cas, jetez un coup d'œil à [instanced rendering] (http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html). – Gnimuc

Répondre

2

Habituellement, le modèle reste le même dans son espace local, il vous suffit de le télécharger une seule fois sur le VBO. Les modifications telles que les translations, les rotations, la mise à l'échelle, etc. sont effectuées en chargeant des matrices de transformation correspondantes en uniformes et en les utilisant dans les shaders.

+0

Merci, ça m'a aidé. Pourquoi ne pas appeler glDrawElements plusieurs fois? Disons que j'ai une animation 2D et tous les ~ 100 images dans un VBO. Chaque boucle principale que je voudrais rendre juste 2 triangles de cette VBO. Est-ce une bonne idée? L'autre façon est de garder 2 triangles dans VBO et de mettre à jour leurs coordonnées de texture ou de les passer en uniforme. Je sais que tout fonctionnera bien, mais qu'en est-il de la performance dans chaque sens? – ElChupacabra

+1

Il est difficile de prévoir car les différents GPU/pilotes se comporteront différemment. Si vous ne faites que rendre un couple de triangles différents à chaque image et que le VBO reste inchangé, vous devriez être ok. Mais là encore, une mise à jour VBO et uniforme plus petite est également quelque chose que les pilotes gèrent bien, donc je ne peux pas dire qui fonctionnera mieux. Ma suggestion pour vous est d'abord de savoir où est votre goulot d'étranglement perf et seulement ensuite l'adresse. –