Je voudrais faire un jeu avec beaucoup de cubes et je prévois de le mettre sur des plateformes mobiles et aussi sur le web en utilisant webgl. Mon problème est quand je fais un appel drawelements par cube, je prends un coup sur la fréquence d'images. Y a-t-il un moyen de faire un appel unique à opengl es pour les dessiner? La seule différence entre les cubes serait la position et la couleur.Façon la plus efficace de dessiner plusieurs objets identiques?
Répondre
J'ai moi-même rencontré le même problème. J'ai posé une question similaire et y ai répondu moi-même hier. Jetez un oeil à:
Efficient way of drawing in OpenGL ES
Vous souhaitez créer vos tampons de vertex et les télécharger sur la carte mémoire graphique une seule fois à l'aide gl.bufferData. Utilisez ensuite la référence à ce tampon chaque fois que vous faites gl.drawElements ou gl.drawArrays. Jusqu'à la prochaine fois que le contenu de votre scène 3D change, vous pouvez utiliser ce tampon qui est téléchargé dans la mémoire de la carte graphique.
Suivez le modèle de UITableView dans la façon dont ils déquaiment les cellules. Je construis un objet qui garde trace des objets que vous avez dessinés et les relie à un identifiant. Ensuite, vous pouvez simplement les déquiler avec ledit identifiant. Si vous savez que vous allez dessiner plusieurs versions du même objet, utilisez cet objet pour minimiser le rendu/les allocations.
Si vous utilisez Vertex Arrays pour votre glDrawElements(), je suggère plutôt d'utiliser Vertex Buffer Objects. Cela stockera le côté serveur de données (en GRAM) au lieu du côté client (dans la RAM système). De cette façon, vous pouvez faire des appels glDrawElements() avec beaucoup moins de CPU < -> overhead de transfert de données GPU.
Vous pouvez également stocker des cubes dans des listes d'affichage. De cette façon, vous pouvez utiliser glTranlate() pour déplacer un cube et ensuite appeler la liste d'affichage pour le rendre. Le seul inconvénient à utiliser les listes d'affichage est que tout ce que vous faites dans la liste d'affichage est immuable; vous ne pouvez pas modifier les appels dans la liste d'affichage sans la recompiler complètement.
OpenGL ES ne supporte pas les listes d'affichage. –
Les positions des cubes l'une par rapport à l'autre vont-elles changer avec le temps? – LarsH
Ils vont probablement changer au fil du temps car je voudrais des objets destructibles. – Xavier
Voir aussi: http://stackoverflow.com/questions/9352355/draw-many-of-the-same-object-quickly-in-opengl – jwrush