Le rendu de plusieurs objets avec OpenGL ES 2.0
Je suis en train d'apprendre OpenGL ES 2.0 pour faire quelques jeux iPhone de développement. J'ai lu à travers de multiples tutoriels et certains de l'OpenGL ES 2.0, spec. Tous les exemples que j'ai vu ont créé un maillage unique, chargé dans un vertex buffer puis rendu (avec les attendus de translation, de rotation, de la pente, etc.)
Ma question est: comment pouvez-vous rendre de multiples objets dans votre scène qui ont différentes mailles et se déplacent de manière indépendante? Si j'ai une voiture et une moto par exemple, je peux créer 2 vertex buffers et de maintenir le maillage des données pour les deux autour de chaque rendu d'appel, et puis il suffit de l'envoyer dans différentes matrices pour le shader pour chaque objet? Ou dois-je besoin de quelque sorte traduire les mailles, puis les combiner en une seule maille, de sorte qu'ils peuvent être rendus dans un pass? Je suis à la recherche pour plus de la stratégie de haut niveau /la structure du programme plutôt que des exemples de code. Je pense que j'ai juste de la mauvaise mentale modal de la façon dont cela fonctionne.
Merci!
- Merci pour les réponses rapides, je comprends maintenant.
- C'est une très bonne question.
- La plupart des exemples, rotation et translation une fois avec un objet de vue. Pour dessiner deux objets différents angles et de position, s'appliquent à l'inverse des opérations après le premier objet. par exemple. translate1, rotate1, draw1, -rotate1, -translate1, translate2, rotate2, draw2 -rotate2, -translate2, ill après un exemple soonish
Vous devez vous connecter pour publier un commentaire.
Vous séparer de vertex/index buffers pour les différents objets, oui. Par exemple, vous pourriez avoir un RenderedObject classe, et chaque instance de vertex buffer. Un RenderedObject peut prendre les sommets d'une maison maille, on peut venir d'un personnage de maillage, etc.
Lors du rendu, vous définissez l'transformer/rotation/ombrage pour le vertex buffer vous travaillez avec, peut-être quelque chose comme:
Comme mentionné dans les autres répondre, le bufferID est juste un GLuint pas la totalité du contenu de la mémoire tampon. Si vous avez besoin de plus de détails sur la création de vertex buffers et les remplir avec des données, je suis heureux de l'ajouter ceux aussi bien.
La meilleure façon que j'ai trouvé à faire c'est à l'aide de VAOs en plus des Organisations sises à vienne.
Je vais d'abord répondre à votre question, à l'aide des Organisations sises à vienne seulement.
Tout d'abord, supposons que les deux mailles de vos deux objets stockés dans les tableaux suivants:
où:
Et vous avez également à vertix tampons:
Maintenant, pour faire ces deux cubes (sans VAOs), vous devez faire quelque chose comme ça:
dans la fonction draw (à partir de OpenGLES modèle):
Cela permettra de répondre à votre question. Mais maintenant utiliser VAOs, votre fonction draw code est beaucoup plus simple (ce qui est bien parce que c'est la répétition de la fonction):
D'abord, vous aurez à définir pour VAOs:
et puis vous allez faire toutes les étapes précédemment fait dans la méthode de tirage, vous le ferez dans la setupGL fonction, mais après la liaison avec le VAO. Ensuite, dans votre tirage de la fonction que vous venez de lier le VAO vous le souhaitez.
VAO ici, c'est comme un profil qui contient un grand nombre de propriétés (imaginez une smart device profile). Au lieu de changer de couleur, ordinateur de bureau, les polices, etc ... à chaque fois que vous souhaitez les modifier, vous devez le faire une fois et l'enregistrer sous un nom de profil. Ensuite, vous venez de passer le profil.
Donc, vous n'avez qu'une seule fois, à l'intérieur de setupGL, puis vous basculez entre eux par un tirage au sort.
Bien sûr, vous pouvez dire que vous avez pu mettre le code (sans VAO) dans une fonction et de l'appeler. C'est vrai, mais VAOs sont plus efficaces selon Apple:
http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW1
Maintenant le code:
Dans setupGL:
Enfin dans votre méthode de tirage:
2.0
appareils. (Il est garanti si ES3.0
) Si vous êtes à la programmation de2.0
, puis d'appelerglGetString(GL_EXTENSIONS)
, et recherchez la chaîneOES_vertex_array_object
dans la réponse. khronos.org/opengles/sdk/1.1/docs/man/glGetString.xml en Particulier sur Android, avec la large gamme de dispositifs, de sorte que vous pouvez en informer l'utilisateur que votre application ne peut pas exécuter, ou revenir à un VBO seule approche.Je réalise que c'est un vieux post, mais j'essayais de trouver des instructions sur la façon d'afficher plusieurs objets au sein d'
OpenGL
. J'ai trouvé un tutoriel qui explique comment rendre les objets multiples et pourrait être facilement étendu pour rendre des objets de types différents (par exemple un cube, une pyramide).Le tutoriel, je vais l'afficher décrit également comment rendre les objets à l'aide de
GLKit
. Je l'ai trouvé utile et j'ai pensé reposter ici. J'espère que cela vous aide aussi!http://games.ianterrell.com/opengl-basics-with-glkit-in-ios5-encapsulated-drawing-and-animation/
Si les mailles sont différents, vous les gardez dans différents vertex buffers. Si elles sont similaires (par exemple. animation, couleur) vous transmettre des arguments au shader. Vous n'avez qu'à garder les poignées pour les Organisations sises à vienne, pas le sommet de données elle-même si vous ne prévoyez pas de l'animation de l'objet sur le côté application. Côté du dispositif d'animation est possible.
Je suis espérons-le-de contribuer à cet ancien post, parce que j'ai entrepris pour résoudre ce problème d'une manière différente. Comme la question asker, j'ai vu beaucoup de "un objet" exemples. J'ai entrepris de placer tous les sommets en un seul VBO, puis enregistrez le décalage de la position de cet objet (par objet), plutôt que d'un tampon de la poignée. Il a travaillé. Le décalage peut être donné comme un paramètre à glDrawElements comme ci-dessous. Il semble évident, en rétrospective, mais je n'étais pas convaincu jusqu'à ce que j'ai vu à l'oeuvre. Veuillez noter que je travaille avec des "vertex" pointeur plutôt que de la plus récente à "vertex attribut pointeur". Je suis en train de travailler vers ce dernier afin que je puisse tirer parti de shaders.
Tous les objets "lier" à la même vertex buffer, avant de faire appel à "tirer des éléments".
Je n'ai pas trouver n'importe où énoncé ce qui était le but de ce décalage, donc j'ai pris une chance. Aussi, cette gotcha: vous devez spécifier le décalage en octets, et non pas des sommets ou des flotteurs. C'est, de la multiplier par quatre pour obtenir la position correcte.
Il est possible lors de l'utilisation de shaders, d'utiliser le même programme pour tous les objets sans avoir à les compiler, de lien et d'en créer un pour chaque. Pour ce faire, il suffit de stocker le GLuint de la valeur au programme et puis, pour chaque objet "glUseProgram(programId);". Comme un résultat de l'expérience personnelle, j'utilise un singleton pour gérer GLProgram structures.. (inclus ci-dessous :))
Noter qu'une fois que les données-espaces (attributs/uniformes) sont passées, vous N'avez pas à passer dans chaque rendu de cycle, mais seulement lorsque invalidé. Il en résulte une grave GPU gain de performance.
Par le VBO côté des choses, la réponse ci-dessus décrit la meilleure façon de traiter avec cela. Par l'orientation de l'équation, vous aurez besoin d'un mécanisme pour nid tdobjects à l'intérieur les uns des autres (similaire à UIView et les enfants de moins de iOS) et puis l'évaluation relative des rotations pour les parents etc.
Bonne chance !