Je pense à une scène de type minecraft, où par voxel vous voulez dire un monde de blocs qui sont réellement rendus à l'aide de polygones:
Si vous utilisez un shader de géométrie, il sera difficile d'éviter d'avoir exactement trois faces (ou autre) par voxel.
Si vous avez beaucoup de blocs adjacents qui ont la même texture, vous pouvez utiliser le pavage des textures pour avoir beaucoup moins de triangles dans votre bande (dégénérée) dans une approche VBO. Je veux dire, s'il y a une belle grande zone plate 6x6 de voxels d'herbe, vous pouvez dessiner tout le haut en seulement 2 triangles plutôt que 64.
Avec l'approche GS, vous ne pouvez pas non plus effectuer l'abattage trivial de visages occlus par des voxels adjacents, ce qui est très simple avec une approche VBO.
Je n'ai pas essayé l'approche GS, mais je peux dire que l'approche VBO avec la combinaison de répétition de tuiles adjacentes fonctionne très bien. J'ai trouvé que jouer avec les indices des éléments était beaucoup plus lent que de simplement répéter les sommets. Si vous divisez votre monde en beaux petits cubes, vous pouvez généralement utiliser un seul octet par composant par sommet et même emballer les informations de texture et les normales (une face sur un cube aligné sur l'axe n'a que 3 normales possibles), etc. dans un quatrième octet à faire 4 octets par sommet, ce qui est agréable et rapide.
J'ai utilisé des VBO séparés pour chacun des 6 visages - vous n'avez besoin que de dessiner au plus 3 d'entre eux évidemment. Cela correspond bien aux différentes textures habituellement utilisées sur les parties supérieures des voxels de style minecraft. Parce que pour chaque ensemble, la normale et telle est alors uniforme.
Avec l'utilisation de pixmaps en mosaïque verticale dans un atlas avec GL_REPEAT
sur l'axe horizontal et ayant des versions tournées à 90 degrés des pixmaps dans le même atlas, j'ai trouvé que je peux dessiner des quantités massives de blocs apparemment différents en utilisant le même VBO dans le même appel. Dans l'exemple de l'herbe 6x6, j'aurais divisé cela en 12 triangles car je n'ai répété qu'une seule dimension dans mon atlas.
J'ai surtout fait fonctionner cela sur le très bas de gamme des puces graphiques intégrées et du mobile, où GS est juste quelque chose avec lequel je peux rêver un jour de jouer.