Je viens de commencer avec OpenGL et j'essaie de l'utiliser pour créer un jeu 2D. Dans ce jeu, j'ai une grille hexagonale composée d'une très grande variété d'hexagones de couleurs différentes. En tant que programmeur débutant OpenGL, je vois deux façons de dessiner cette grille:
- Utilisation d'un tampon de sommet avec les données d'un seul hexagone, puis utilisation d'une valeur de décalage uniforme et itération sur le processeur pour dessiner plusieurs fois le même programme jusqu'à ce que j'ai une grille.
- Création d'un très grand tampon de sommets pré-calculé singulier qui dessine tous les hexagones en un seul appel.
Quelle est la méthode la plus efficace? Existe-t-il une meilleure façon de le faire?
Réponses:
Il existe en effet plusieurs façons de réaliser une telle grille.
Le moyen le plus efficace serait l'instanciation. De cette façon, vous ne créez votre hexagone qu'une seule fois dans un VBO et le restituez cent, mille ou un million de fois. Vous pouvez le faire manuellement en utilisant des shaders avec des uniformes comme vous l'avez dit au point 1, mais il y a aussi une fonctionnalité OpenGL intégrée pour cela. Pour cela, jetez un œil à glDrawElementsInstanced .
Notez que l'instanciation n'est plus rapide que les autres méthodes si vous dessinez plus d'une certaine quantité d'objets instanciés. Par exemple, dessiner 300 peut être plus rapide en utilisant 1 gros VBO, mais dessiner 2 millions peut être plus rapide si vous utilisez le rendu instancié.
Si vous utilisez le rendu instancié, vous pouvez envoyer des données par objet à l'aide des diviseurs d'attribut . Dans votre cas, vous souhaitez envoyer la position et la couleur.
Un bon tutoriel sur le rendu instancié: cliquez sur
La meilleure façon est d'essayer les deux méthodes et de vérifier le nombre de millisecondes nécessaires pour dessiner 1 image. De cette façon, vous apprenez également les deux façons, ce qui est toujours bon.
Notez également que le rendu instancié est une fonctionnalité OpenGL moderne et que vous devrez utiliser des shaders pour l'utiliser. Mais il est toujours préférable de l'apprendre correctement depuis le début.
la source
La méthode 1 est plus simple à coder et convient parfaitement tant que vous n'avez pas trop d'hexagones en vue à la fois. Vous voudrez peut-être vous en tenir à cela puisque vous êtes nouveau sur OpenGL, pour éviter de mettre trop de complexité dans votre assiette à la fois.
S'il y a un grand nombre d'hexagones (comme plusieurs centaines ou plus d'un millier) en vue à la fois, une méthode de surcharge moindre serait nécessaire pour éviter la surcharge CPU de faire autant de tirages individuels. La méthode 2 fonctionnerait pour cela, ou mieux encore, utiliser l'instanciation. Je m'attends à ce que l'instanciation soit plus rapide que la méthode 2, ou certainement pas pire, car vous n'avez qu'à mettre à jour un tampon de données par instance plutôt qu'un tampon (beaucoup plus grand) de données de vertex pour toutes les instances.
la source