OK, je comprends que les gl_quads sont obsolètes, et donc nous ne sommes plus «censés» les utiliser. Je comprends également qu'un PC moderne lors de l'exécution d'un jeu utilisant gl_quads dessine en fait deux triangles.
Maintenant, j'ai entendu à cause de cela qu'un jeu devrait être écrit en utilisant des triangles à la place. Mais je me demande si, en raison des spécificités de la façon dont OpenGL transforme ce quad en deux triangles, est-il toujours avantageux d'utiliser des quads?
Plus précisément, je restitue actuellement de nombreux quads non connectés à partir d'objets de tampon assez gros. L'une des zones auxquelles je dois faire attention est la taille du vecteur de flottants que j'utilise pour créer / mettre à jour ces objets tampon (j'ai plusieurs valeurs flottantes supplémentaires par sommet et beaucoup de sommets dans un tampon - le les plus gros tampons font environ 500 Ko).
Il me semble donc que si je modifie mes objets tampons pour dessiner des triangles, ces données de sommet vont être 50% plus grandes (six sommets pour dessiner un carré plutôt que 4) et prendre 50% de plus pour que le CPU les génère.
Si gl_quads fonctionne toujours, est-ce que j'obtiens un avantage ici, ou est-ce que la mémoire supplémentaire de 50% et le temps CPU sont toujours utilisés lors de la conversion automatique d'OpenGL en deux triangles?
Réponses:
Testez votre jeu réel. Si les quads sont plus rapides, utilisez-les. Sinon, non.
On peut penser qu'ils sont plus lents dans certains cas parce que certains matériels ne prennent pas en charge les quads, de sorte que le pilote doit faire beaucoup de travail pour "corriger" les appels de tirage en quad. Certains matériels prennent en charge les quads, effectuant la division en triangles dans une étape d'assemblage d'entrée à fonction fixe, de sorte qu'il fonctionne sans surcharge significative. Il y a aussi des questions concernant la façon dont les quads sont soumis indexés vs non indexés, comme vous l'avez dit, et qui utilise mieux la bande passante de transfert de bus limitée et le temps de génération de CPU. La sagesse populaire dit d'éviter les quads, ce qui est un bon conseil si vous partez de rien, peut-être pas si votre code fonctionne déjà. la sagesse populaire dit que beaucoup de choses tuent la performance malgré de vrais jeux bien performants qui font ces choses.
Bref, testez. Ne présumez pas et ne demandez pas à Internet des conseils sur les performances. Nous avons peut-être parfois raison, mais le plus souvent, nous vous fournirons des données obsolètes, des données basées sur une circonstance spécifique dans laquelle vous n'êtes pas ou des ordures que nous avons nous-mêmes acquises de seconde main sur Internet ou des collègues (qui eux-mêmes peuvent ne pas avoir une expérience de première main).
la source
Quelles sont les alternatives? Eh bien, une alternative consiste à utiliser des Shaders de géométrie , en passant une
GL_LINES_ADJACENCY
primitive (4 sommets) et en demandant à la GS de convertir cette primitive en une bande triangulaire. Cependant, le rendu sera plus lent, car il faut supposer que les shaders de géométrie sont toujours plus lents à rendre.Une meilleure méthode consiste à utiliser le rendu indexé. Ici, vous avez deux alternatives:
GL_TRIANGLES
etGL_TRIANGLE_STRIP
avec un redémarrage primitif. Ce dernier se traduira par un tampon d'index légèrement plus court (un index pour chaque quad). Vous pouvez réutiliser le même tampon d'index pour tout rendu quad, vous n'aurez donc pas besoin de mettre à jour ou de modifier le tampon d'index.Je suggère également d'utiliser des shorts non signés comme type d'index. Si vous devez rendre plus de 16384 quads à la fois, effectuez plusieurs appels de rendu à l'aide de glDrawElementsBaseVertex pour compenser les indices.
la source
glMultiDrawArraysIndirect
de le faire côté GPU. Ce que vous pouvez faire, mais cela limite le matériel.