
Une des étapes importantes dans le rendu de particules consiste à transformer un point en un quad billboardé (qui fait toujours face à la caméra). Le billboarding peut être fait à l’aide des point sprites ou en utilisant un geometry shader comme expliqué dans cet article. Les deux méthodes produisent des resultats similaires. Mais quelle est la méthode la plus rapide si l’on doit rendre beaucoup de particules (1 million ou plus) ?
Pour essayer de répondre à cette question, j’ai préparé une petite démo qui effectue le rendu de 1’000’000 de particules. Chaque particule est animée de manière très simple dans le vertex shader. La démo est disponible en deux versions qui ne diffèrent que par le programme GLSL de rendu de particule: un programme basé sur le point sprite, l’autre sur le geometry shader.
La démo de test est disponible dans le répertoire host_api/Particle_PointSprite_vs_GS_Billboarded_Quads/
du demopack de GLSL Hacker. J’ai corrigé un petit bug relatif au fullscreen et il est conseillé de récupérer GLSL Hacker 0.7.0.3 + pour faire des tests corrects.
Machine de benchmark:
– CPU: Intel Core i5-4670K @ 3.4GHz
– Memory: G-Skill 16GB DDR3 1600MHz
– Windows 8 64-bit
– Catalyst 14.4 pour les cartes Radeon
– R340.65 pour les cartes GeForce
– GLSL Hacker 0.7.0.3
– FRAPS pour la mesure des FPS en plein écran.
Settings: particules: 1’000’000, resolution: 1920×1080 fullscreen.
Point Sprite | Geometry Shader | Différence | |
Radeon HD 7970 | 147 FPS | 105 FPS | -28% |
Radeon HD 6970 | 98 FPS | 65 FPS | -33% |
Radeon HD 5870 | 85 FPS | 59 FPS | -30% |
GeForce GTX 780 | 295 FPS | 279 FPS | -5% |
GeForce GTX 750 | 203 FPS | 122 FPS | -39% |
GeForce GTX 680 | 72 FPS | 71 FPS | -1% |
Analyse: le rendu de particules avec le geometry shader est environ 30% plus lent qu’avec les point sprites sur les GPUs Radeon. C’est assez surprenant car les GPUs Radeon ont un support hardware spécial pour le rendu de quad avec les geometry shaders (voir petite explication dans ce guide, en page 9: Radeon HD 2000 Programming Guide). J’ai donc questionné AMD à ce sujet et cette baisse de performance est tout à fait normale. De plus, il n’y a aucune mention dans aucune des docs internes de ce fameux support matériel dans le cas d’amplification 1:4 du le geometry shader.
Avec les cartes NVIDIA, on voit apparaitre deux classes de GPUs: une classe où la différence est peu importante voire négligeable (les GTX 780 et 680) et une classe où la différence est importante (GTX 750: -39%) un peu comme ce qui est observé sur les Radeon.
Conclusion: ce n’est pas une surpise, on s’en doutait un peu, la méthode la plus rapide pour le rendu de particules sur NVIDIA GeForce et AMD Radeon est le rendu basé sur les point sprites. Depuis OpenGL 3, les point sprites sont activés par défaut lors du rendu de points.

Un petit million de particles
J’avais lu dans les GCN performance tweets que c’est préférable d’utiliser l’instancing au lieu d’utiliser un geometry shader qui fait de l’expansion fixe.
ça vaut la peine de tester non :D?
J’ai fait quelques tests d’instancing et je vais publier un petit article dans pas longtemps…