7
votes

Eléments de positionnement dans l'espace 2D avec OpenGL ES

Dans mon temps libre, j'aime jouer avec le développement de jeux sur l'iPhone avec OpenGL ES. Je jette une petite démonstration de Side-Schroller 2D pour le plaisir, et je suis relativement nouveau à OpenGL, et je voulais obtenir une participation de développeurs plus expérimentée à ce sujet.

Voici ma question: ça fait sens de spécifier les sommets de chaque élément 2D dans l'espace modèle, puis traduisez chaque élément à son espace de vue final chaque fois strong> un cadre est dessiné? p>

Par exemple, disons que j'ai un Ensemble de blocs (carrés) qui constituent le sol dans mon défileur latéral. Chaque carré est défini comme suit: P>

glPushMatrix();
{
    glTranslatef(currentSquareX, currentSquareY, 0.0);
    glVertexPointer(3, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);

    // Do the drawing
}
glPopMatrix();


0 commentaires

3 Réponses :


6
votes

Vous êtes préoccupé par les frais généraux qu'il faut pour transformer un modèle (dans ce cas un carré) des coordonnées de modèle aux coordonnées mondiales lorsque vous avez beaucoup de modèles. Cela semble être une optimisation évidente pour les modèles statiques.

Si vous construisez les sommets de votre carré dans les coordonnées du monde, alors il va être plus rapide car chaque carré évitera le coût supplémentaire de ces trois fonctions (GLPUSHMATRIX, GLPOPMATRIX et GLTANSLATEF), car il n'est pas nécessaire de se traduire de modèle aux coordonnées mondiales au moment du rendu. Je ne sais pas à quel point cela sera plus rapide, je soupçonne que ce ne sera pas une optimisation humanisante et que vous perdez la modularité de garder les carrés dans les coordonnées de modèle: Et si vous décidez que vous voulez que ces carrés soient mobiles ? Ce sera beaucoup plus difficile si vous gardez leurs sommets dans les coordonnées du monde.

En bref, c'est un compromis:

Coordonnées du monde
  • plus de mémoire - chaque carré a besoin de sa propre ensemble de sommets.
  • moins de calcul - pas besoin d'effectuer GLPUSHMATRIX, GLPOPMATRIX, OU Gltranslatef pour chaque carré au moment du rendu.
  • moins flexible - manque de soutien (ou complique) pour déplacer dynamiquement ces carrés

    Coordonnées du modèle
    • Moins de mémoire - Les carrés peuvent partager les mêmes données Vertex
    • plus de calcul - chaque carré doit effectuer trois fonctions supplémentaires à Temps de rendu.
    • plus flexible - les carrés peuvent facilement être déplacé en manipulant le Call Gltranslatef.

      Je suppose que le seul moyen de savoir quelle est la bonne décision consiste à faire et à profiler. Je sais que vous avez dit que vous n'avez pas encore écrit cela, mais je soupçonne que vos carrés sont dans le modèle ou le monde des coordonnées, cela ne fera pas une grande différence - et si cela le fait, je ne peux pas imaginer une architecture que vous pouviez créer où il serait difficile de changer vos carrés du modèle aux coordonnées mondiales ou inversement.

      bonne chance à vous et à vos aventures dans iPhone Game Development!


1 commentaires

Merci, c'est une bonne réponse. Je soupçonnai qu'il y aurait un compromis comme vous l'avez décrit. Je pense que je vais d'abord donner des coordonnées de modèle, en attendant des tests.



1
votes

Vous pouvez également envisager d'utiliser une image statique et simplement le défilement qu'au lieu de dessiner chaque bloc de plancher et de la traduction de sa position, etc.


0 commentaires

4
votes

Si vous utilisez uniquement des quads alignés sur l'écran, il pourrait être plus facile d'utiliser le OES Draw Texture extension. Ensuite, vous pouvez utiliser une seule texture pour contenir tout votre jeu "Sprites". Premièrement, spécifiez le rectangle de culture en réglant le gl_texture_crop_rect_oes code> texparameter. C'est la limite du sprite dans la texture plus grande. Pour rendre, appelez GLDRAWTEXIOES code> en passant dans la position souhaitée et la taille des coordonnées ci-jointes.

int rect[4] = {0, 0, 16, 16};
glBindTexture(GL_TEXTURE_2D, sprites);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(x, y, z, width, height);


1 commentaires

Très cool! Je vais devoir essayer cela, je travaille sur l'iPhone - cela semble très intéressant.