Y a-t-il encore des avantages à utiliser gl_quads?

10

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?

user27018
la source
5
Je suis sûr qu'OpenGL prend en charge une sorte de tampon de vertex indexé, ce qui signifie que vous ne stockez que les 4 mêmes sommets pour un quad, et au lieu de répéter des sommets entiers pour faire les deux triangles, vous ne répétez que les indices: [0,1,2] , [2,3,0]
Grande réponse ici
bobobobo
Je crois que la spécification GL stipule toujours certains cas où le dessin en quad est important, par exemple avec glPolygonMode (..., GL_LINE).
Maximus Minimus

Réponses:

5

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).

Sean Middleditch
la source
3

Quelles sont les alternatives? Eh bien, une alternative consiste à utiliser des Shaders de géométrie , en passant une GL_LINES_ADJACENCYprimitive (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_TRIANGLESet GL_TRIANGLE_STRIPavec 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.

Nicol Bolas
la source
Une analyse comparative récente que j'ai effectuée montre que glMultiDrawArrays est désormais un moyen rapide à la fois pour NV et AMD (ne dérange pas Intel), il existe donc une autre option - glMultiDrawArrays avec ventilateur ou bande.
Maximus Minimus
@ mh01: Cela nécessite un tableau côté client de commandes de dessin. Vous auriez besoin glMultiDrawArraysIndirectde le faire côté GPU. Ce que vous pouvez faire, mais cela limite le matériel.
Nicol Bolas