Android OpenGL ES glDrawArrays ou glDrawElements?
Quelle est la meilleure façon: si j'utilise glDrawArrays
, ou si j'utilise glDrawElements
? Une différence?
- L'on a accepté la réponse est un peu obsolète. À la suite de la doc lien dans Jorn Horstmann réponse, Apple décrit utilisation de "dégénéré-triangles" truc avec DrawElements, et ainsi obtenir le meilleur des deux mondes. Le mineur d'épargne de quelques indices en utilisant DrawArrays n'est pas la peine de l'épargne que vous obtenez par la combinaison de tous vos données en un seul GL appel, DrawElements. (Vous pouvez combiner le tout en utilisant DrawArrays, mais ensuite tout "perdu éléments" serait gaspiller de sommets, qui sont beaucoup plus grandes que les indices, et nécessitent plus de temps de rendu trop.) MIEUX: UN seul DrawElements appel avec GL_TRIANGLE_STRIP.
Vous devez vous connecter pour publier un commentaire.
Pour les deux, vous passez OpenGL certains tampons contenant vertex.
glDrawArrays est fondamentalement dessiner cette plage contiguë de sommets, en utilisant les données que je vous ai donné plus tôt".
Bon:
Mauvais:
Avec glDrawElements, vous passez dans un tampon contenant les indices des sommets que vous voulez dessiner.
Bonne
Mauvais
Ma recommandation est d'utiliser glDrawElements
Les conséquences de performance sont probablement similaires sur l'iphone, le OpenGL ES Guide de Programmation pour iOS recommande l'utilisation du triangle de bandes et de rejoindre plusieurs bandes à travers dégénérer triangles.
Le lien a une belle illustration de la notion. De cette façon, vous pourriez réutiliser certains sommets et de faire toujours tout le dessin en une seule étape.
L'inconvénient est que vous avez probablement besoin d'une étape de prétraitement qui permet de trier vos maillage afin d'obtenir suffisamment long des bandes.
Je ne pouvais pas venir avec un bon algorithme pour cela encore, donc je ne peux pas en donner de la performance ou de l'espace des nombres par rapport à GL_TRIANGLES. Bien sûr, cela est également fortement dépendante des mailles que vous voulez dessiner.
En fait, vous avez peut dégénérer le triangle strip pour créer des bandes continues de sorte que vous n'avez pas à split lors de l'utilisation de glDrawArray.
J'ai été en utilisant glDrawElements et GL_TRIANGLES mais la réflexion sur l'utilisation de glDrawArray plutôt avec GL_TRIANGLE_STRIP. De cette façon, il n'est pas nécessaire pour la création de inidices vecteur.
Quelqu'un qui en sait plus sur le vertex cache chose qui a été mentionnée ci-dessus dans l'un des postes? La réflexion sur la performance entre glDrawElements/GL_TRIANGLE vs glDrawArray/GL_TRIANGLE_STRIP.
Accepté la réponse est un peu obsolète. À la suite de la doc lien dans Jorn Horstmann réponse, OpenGL ES Guide de Programmation pour iOS, Apple décrit comment utiliser dégénéré "-triangles" truc avec DrawElements, obtenant ainsi le meilleur des deux mondes.
Le mineur d'épargne de quelques indices en utilisant DrawArrays n'est pas la peine de l'épargne que vous obtenez en combinant toutes vos données en un seul GL appel, DrawElements. (Vous pouvez combiner le tout en utilisant DrawArrays, mais ensuite tout "perdu éléments" serait gaspiller de sommets, qui sont beaucoup plus grandes que les indices, et nécessitent plus de temps de rendu trop.)
Cela signifie également que vous n'avez pas besoin d'examiner attentivement tous vos modèles, si la plupart d'entre eux peuvent être rendues par un nombre minimal de bandes, ou ils sont trop complexes. Une solution uniforme, qui s'occupe de tout. (Mais essayer de s'organiser en bandes, si possible, de minimiser les données envoyées, et de maximiser GPU probabilité de ré-utiliser récemment mis en cache sommet des calculs.)
MIEUX: UN seul DrawElements appel avec GL_TRIANGLE_STRIP, contenant tous vos données (qui est en train de changer dans chaque image).