J'aimerais dessiner un grand nombre (plusieurs milliers) de maillages simples (chacun peut-être ... un maximum de 50 triangles, mais même cela est une très haute limite supérieure), qui sont tous exactement les mêmes.
En tant que moyen de force brute simple, en ce moment, je ne fais que des milliers d'appels de dessin, où je change simplement les matrices de transformation dont les shaders ont besoin, puis dessine à nouveau les mêmes objets.
Bien sûr, cela est horriblement lent, car (je suppose) il y a trop d'appels de tirage pour que le pilote et mon PC soient traités efficacement.
Que puis-je faire pour l'accélérer?
Réponses:
La solution à cela est l'instanciation. Ce tutoriel explique quelques méthodes d'instanciation. Si vous en avez
ARB_draw_instanced
etARB_instanced_arrays
utilisez-les.L'idée générale est de stocker toutes les transformations de vos maillages dans un objet tampon séparé et de le lier à un tableau d'attributs qui utilise un "sommet" par instance via
glVertexAttribDivisor
.Si, après cela, vous ne courez toujours pas aussi vite que vous le souhaitez, vous êtes probablement lié au processeur de vertex. Faites un tri sélectif sur les mailles, et construisez de préférence un BVH pour traverser au lieu de faire le tri sur toutes les mailles indépendamment.
la source
glVertexAttribDivisor
(qui n'est en aucun cas obsolète ou obsolète) a l'avantage de ne pas avoir de limite supérieure sur le nombre d'instances. Les performances ont été historiquement meilleures que les tampons uniformes, mais elles sont probablement identiques ou très similaires maintenant, et les deux manières font le travail.