L'utilisation de Vertex Array d'Objets et de Vertex Buffer Objects
Je suis en train d'essayer de comprendre ces deux-là, comment les utiliser et comment ils sont liés. Disons que je veux créer un simple relief et une texture cube. Pour les deux objets que j'ai le tableau des sommets des triangles et pour le cube, j'ai un tableau contenant la texture de données. Ma question est: comment puis-je utiliser VAOs et Organisations de créer et de rendre ces deux?
- Aurais-je créer un VAO et VBO pour chaque objet?
- ou devrait créer un VAO pour chaque objet du VBO (sommets, de données de texture, etc.)?
Il existe de nombreux tutoriels et des livres, mais je ne comprends toujours pas l'idée même de la façon dont ces concepts doivent être compris et utilisé.
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous avez besoin de comprendre deux choses:
Vertex Array d'Objets (VAOs) sont théoriquement rien mais mince état papiers d'emballage.
Vertex Buffer Objects (Organisations) de stocker des données réelles.
Une autre façon de penser à ce sujet est que VAOs décrire les données stockées dans une ou plusieurs Organisations sises à vienne.
Penser à des Organisations sises à vienne (tampon et d'objets en général) non structurées tableaux de données stockées dans le serveur (GPU) de la mémoire. Vous pouvez mettre en page vos vertex de données dans des tableaux si vous le souhaitez, ou vous pouvez les emballer dans un seul tableau. Dans les deux cas, des tampons, des objets se résument à des endroits où vous allez stocker des données.
Vertex Array pistes des Objets réels pointeurs à VBO mémoire nécessaire pour les commandes de dessin.
Ils sont un peu plus sophistiqué que des pointeurs comme vous le savez dans un langage comme C, cependant. Sommet des pointeurs de garder une trace de la mémoire tampon de l'objet qui a été lié quand ils ont été spécifiés, le décalage dans son espace d'adressage, foulée entre vertex attributs et comment interpréter les données sous-jacentes (par exemple l'opportunité de maintenir des valeurs entières ou de les convertir en virgule flottante [0.0,1.0] en normalisant pour le type de données de la gamme).
Par exemple, de données entier est habituellement converti à virgule flottante, mais c'est la commande utilisée pour spécifier le sommet pointeur (
glVertexAttribPointer (...)
vsglVertexAttribIPointer (...)
) qui détermine ce comportement.Vertex Array d'Objets aussi la piste de la mémoire tampon d'objet lié actuellement à
GL_ELEMENT_ARRAY_BUFFER
.GL_ELEMENT_ARRAY_BUFFER
est l'endroit où la commande:glDrawElements (...)
sources de sa liste d'indices (en supposant un non-zéro de liaison) et il n'y a pas deglElementArrayPointer (...)
de commande.glDrawElements (...)
combine le pointeur et la commande de dessin en une seule opération, et d'utiliser la liaison stockés dans le Vertex Array Objet pour accomplir cette tâche.Avec cela de la façon, à moins que vos objets de partager sommet de données vous sont généralement va avoir besoin d'un seul ensemble d'Organisations sises à vienne pour chaque.
Vous pouvez utiliser un seul VAO pour l'ensemble de votre logiciel si vous le souhaitez, ou vous pouvez prendre avantage du fait que la modification de la limite VAO changements quasi-totalité de l'ensemble d'états nécessaires pour dessiner des objets différents.
Ainsi, le dessin de votre terrain et le cube pourrait être aussi simple que de changer le VAO. Vous pourriez avoir à faire plus que cela, si vous avez besoin d'appliquer des textures différentes pour chacun d'eux, mais le VAO prend soin de tous les vertex des données liées à l'installation.
Votre question n'est pas facile de répondre ici, mais plutôt dans un tutoriel. Vous le savez probablement déjà ces deux sites, mais si pas, je pars de la des références.
OGLDEV
OpenGL-Tutorial.org
Maintenant d'essayer d'élucider vos questions, un Sommet Objet Array est un OpenGL objet conçu avec l'objectif de réduction de l'API généraux pour le tirage des appels. Vous pouvez penser que c'est un conteneur pour un Vertex Buffer et de ses états associés. Quelque chose de semblable peut-être à l'ancien affichage des listes.
Normalement, il y a un 1 à 1 relation entre un VAO et un VBO, qui est, à chaque VAO contient un unique VBO. Mais ce n'est pas strictement nécessaire. Vous pouvez avoir plusieurs VAOs référence à la même VBO.
La façon la plus simple de ce modèle dans le code, je pense, serait pour vous d'avoir commis des actes de classe/type et une méthode pour joindre un VBO à elle. Puis donner un exemple de VAO à chaque maille. Le maillage peut avoir une référence à un VBO type qui peut être son propre ou partagée.
;)
excuses si ma réponse a adopté une compréhension différente.