Je prévois de faire l'instanciation de la géométrie dans OpenGL ES 2.0 Fondamentalement, je prévois de rendre la même géométrie (une chaise) peut-être 1000 fois dans ma scène.
Quelle est la meilleure façon de procéder dans OpenGL ES 2.0?
J'envisage de passer la vue de modèle mat4 comme attribut. Étant donné que les attributs sont des données par sommet, dois-je passer ce même mat4, trois fois pour chaque sommet du même triangle (car la vue du modèle reste constante à travers les sommets du triangle).
Cela équivaudrait à beaucoup de données supplémentaires envoyées au GPU (2 sommets supplémentaires * 16 flottants * (nombre de triangles) quantité de données supplémentaires).
Ou dois-je envoyer le mat4 une seule fois par triangle? Mais comment est-ce possible en utilisant des attributs puisque les attributs sont définis comme des données "par sommet"?
Quel est le moyen le plus efficace et le plus efficace de faire l'instanciation dans OpenGL ES 2.0?
la source
glVertexAttribDivisor
:(Réponses:
ES2 n'a ni glVertexAttribDivisor ni textures à virgule flottante, donc vos options sont assez limitées.
Mettez définitivement votre modèle de chaise dans un VBO si vous ne le faites pas déjà. À partir de là, vous êtes plus ou moins limité aux appels individuels - un par chaise - il s'agit donc d'obtenir la matrice de transformation de chaque chaise vers le GPU aussi efficacement que possible.
Vous pouvez le faire avec des appels glUniform réguliers, ou vous pouvez abuser de certains emplacements d'attributs de vertex supplémentaires et effectuer des appels glVertexAttrib (remarque: pas glVertexAttribPointer) avant de dessiner chaque chaise, en spécifiant la matrice à l'aide de 4 de ces emplacements, et ces valeurs «colleront» pour chaque sommet suivant dans la chaise. Cela peut être un chemin assez rapide sur certains matériels mais plus lent sur d'autres, vous devrez donc expérimenter.
Si vos chaises ne tournent pas, vous pouvez simplement envoyer la position à votre shader et y construire une nouvelle matrice de transformation à la volée. Cela semble horrible, mais c'est en fait incroyablement rapide (il suffit de régler 3 flotteurs) et pourrait faire le travail.
Dans l'ensemble cependant, et en supposant que vous visiez une plate-forme mobile typique, je pense que quoi que vous fassiez, dessiner des appels va vous tuer.
la source
Votre meilleur pari est d'utiliser une approche instanciante assez similaire aux modèles skinnés. Créez un VBO qui contiendra de nombreuses copies de votre chaise, toutes identiques. Maintenant, chaque sommet doit avoir un attribut byte qui contiendra l'index de la matrice de transformation qui lui sera appliquée. Envoyez un tableau de matrices à votre shader et utilisez-les comme la transformation du monde de chacune de vos chaises. De cette façon, vous pouvez dessiner dans chaque appel autant de chaises que la taille maximale du paramètre de tableau, sans avoir à réécrire de données dans le VBO.
la source
Wolfire Games a un excellent article de blog sur l' instanciation rapide d'objets . Ce qu'ils font, c'est rendre le modèle plusieurs fois, mais envoyer une matrice différente pour chaque objet dans un emplacement uniforme.
C'est un moyen assez efficace d'inclure un tas d'objets, car vous n'avez qu'à envoyer les données une fois (le plus gros goulot d'étranglement lors du rendu d'un lot d'objets sera toujours la bande passante), puis à transformer le modèle dans un shader.
la source
http://www.youtube.com/watch?v=rfQ8rKGTVlg
Il s'agit d'un Google Talk sur WebGL, qui est OpenGL ES pour JavaScript, ce qui signifie qu'il n'y a pas non plus d'instanciation de la géométrie. Cela peut vous donner une idée, mais c'est difficile à dire car je ne sais pas si votre goulot d'étranglement est sur le GPU ou le CPU.
Cependant, vous devriez vous renseigner sur les variables uniformes, il n'est absolument pas nécessaire d'envoyer un mat4 dans un attribut, tous les sommets de votre chaise seront transformés par la même matrice, vous ne devez l'envoyer qu'une seule fois par modèle, pas par triangle. Les variables uniformes vous permettent de le faire, elles sont un type spécial de variables que vous pouvez définir dans le programme de shader lui-même.
la source