Question

C’est quelque chose que je cherche depuis un moment, mais je n’ai pas encore trouvé d’informations concrètes ni de bons exemples. J'ai, par exemple, un tas d'objets non liés (des bandes de triangle par exemple). Quel est le moyen efficace de les rendre?

J'ai entendu parler de la possibilité de mettre plusieurs objets dans un VBO pour réduire les appels openGL, mais je n'ai pas vu d'exemple approprié pour ce faire. J'ai aussi vu des messages contredisant cette idée. Donc pour le moment, je suis surtout confus.

Était-ce utile?

La solution

Tout d’abord, vous devriez probablement utiliser VBO tout le temps. Pour les petits et les grands objets.

Ensuite, le deuxième problème est & "Comment combiner plusieurs objets distincts en un seul objet volumineux? &"; - afin de réduire le nombre d'appels OpenGL à effectuer. En règle générale, les objets qui utilisent la même texture, les mêmes paramètres de matériau et les mêmes shaders peuvent être combinés. Par exemple. Si vous avez des tonnes de caisses identiques, il peut être judicieux de les combiner en plusieurs & "; tas de caisses &";.

Si un objet est une liste de triangles, la combinaison est facile - créez simplement une grande liste de triangles à partir des listes sources. Si un objet est une bande triangulaire, vous devez utiliser & "; Triangles dégénérés &"; joindre les bandes (il s'agit d'une optimisation très utile pour un seul objet également, s'il ne peut pas être représenté sous la forme d'une seule bande).

Un " triangle dégénéré " est un triangle qui a deux ou trois index de sommet identiques. Le matériel graphique peut les reconnaître et les ignorer très rapidement.

Donc si vous avez, par exemple deux bandes avec un triangle chacune, pour un total de six sommets.

Les indices de triangle originaux des bandes seraient:

1) 0, 1, 2
2) 0, 1, 2

Maintenant, vous réunissez tous les sommets pour obtenir 6 sommets.

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

Vous avez maintenant un tableau de sommets, mais deux bandes distinctes. Devoir les rejoindre en insérant des triangles dégénérés:

1) 0, 1, 2, 2, 2, 3, 4, 5

(je pense que ce qui précède est correct, mais n'a pas encore été vérifié)

L'idée est la suivante: avec la bande ci-dessus, la carte graphique dessinerait des triangles à partir de ces sommets:

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

En règle générale, vous devez insérer deux ou trois triangles dégénérés en fonction de la longueur de la bande d'origine, afin que l'enroulement du triangle reste correct.

Autres conseils

Recherchez glDrawElements () , c’est un bon moyen de réaliser ce que vous voulez. Notez que les performances risquent de chuter si vos données changent chaque image, car vous devez ensuite mettre à jour les parties pertinentes des données, ce qui signifie les copier dans la mémoire de la carte graphique. Pour les données statiques, cela est très rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top