Le moyen le plus rapide de dessiner de petites particules en opengl?

8

Question rapide: Quelle est la méthode la plus rapide pour rendre un large éventail de particules 4x4 / 8x8 en opengl? Actuellement, je dépense 2 triangles pour chacun, mais je pense que c'est lent, donc j'aimerais vraiment savoir si je le fais bien .....

user1010005
la source
1
Juste un rappel que puisqu'il s'agit d'une question de performances, vous devez mesurer les performances sur votre plate-forme cible, (a) pour vous assurer qu'elle est vraiment assez chère pour mériter d'être inquiétée et (b) pour tester l'accélération de toutes les solutions proposées.
Nathan Reed

Réponses:

6

Vous pouvez dessiner des points avec OpenGL.

Vous souhaitez appeler glDrawArrays () ou glDrawElements () avec GL_POINTS (au lieu de GL_TRIANGLE_STRIP ou tout ce que vous utilisez.)

Cela attirera des points sur l'écran en fonction de la taille actuelle du point, que vous pouvez définir via glPointSize () . Vous pouvez également alias ces points, mais d'après mon expérience, tous les pilotes / matériels ne prennent pas en charge les points alias.

Vous ne pouvez pas texturer ces points; ils ne sont qu'une seule couleur.

notlesh
la source
Merci pour l'astuce. Savez-vous par hasard si je pourrais faire la méthode GL_POINT avec des shaders pour que je puisse leur mapper une texture également?
user1010005
1
Vous pouvez utiliser des shaders, mais il n'y a qu'un seul sommet pour un point (au centre), donc vous aurez peut-être du mal à trouver des coords tex. stackoverflow.com/questions/5839095/… semble qu'il en parle un peu ...
notlesh
Vous pouvez également définir un sprite ponctuel avec GL_POINTS.
Mick
1
@ user1010005 Pour texturer la carte avec GL_POINTS, vous pouvez examiner GL_POINT_SPRITE_ARB. De plus, je suis à peu près sûr que les points finissent toujours par occuper le même nombre de pixels à l'écran, peu importe à quelle distance vous en êtes.
kevintodisco
@ktodisco, vous pouvez passer la taille en points comme attribut. j'ai obtenu un effet d'étoile décent en faisant cela. pour changer la taille dans le vert shader, vous affectez la variable gl_PointSize
notlesh
3

Dans le noyau OpenGL 3.2 et supérieur, les shaders de géométrie sont disponibles pour utilisation. Pour donner un bref aperçu, vous diriez uniquement à OpenGL de dessiner les points qui représentent les positions de vos particules, et ces points passeraient normalement par le vertex shader, mais lorsqu'ils arriveront au géométrie shader, il construira le rectangle (sur de deux tris) en émettant des sommets à l'étape suivante du pipeline. Avec les sommets, vous pouvez générer par programme des normales et des coordonnées de texture.

Étant donné que tout cela se fait dans le matériel, je suis presque sûr que c'est le moyen le plus rapide en ce moment pour restituer des particules ponctuelles.

kevintodisco
la source
1
C'est probablement une meilleure solution que GL_POINTS, mais cela ne fonctionnera pas pour les anciennes implémentations OpenGL (et OpenGL ES).
notlesh
Cela semble génial, mais je prévois de porter mon jeu sur la plate-forme Android :(
user1010005
2
@ user1010005 Juste un conseil, vous devez mentionner que lorsque vous posez la question, nous savons donc avec quelles contraintes travailler :)
kevintodisco
Je suis un débutant avec opengl désolé D:
user1010005
Je voudrais AIMER pour voir le geometry shader mis à disposition dans OpenGL ES. ) =
notlesh