2010-04-20 3 views
1

J'ai essentiellement un jeu 2D sur l'iPhone et j'essaie de configurer plusieurs arrière-plans qui défilent à différentes vitesses (connus sous le nom de milieux de parallaxe). Donc, ma pensée était de coller les arrière-plans DERRIÈRE l'avant-plan en utilisant différents plans de coordonnées z, et juste les faire plus grand que l'avant-plan (en taille) pour accueillir, de sorte que le tout peut être défilé (juste à vitesse différente).Arrière-plans Parallax dans OpenGL ES sur l'iPhone

Et (pour autant que je sache) j'ai fondamentalement implémenté cela. Le seul problème est qu'il semble complètement ignorer la valeur z que je lui donne, ou plutôt il ne fait que les mettre tous en zéros. Je vois l'arrière-plan (je n'ai testé qu'un seul fond jusqu'ici, pour le garder simple ... donc pour l'instant j'ai juste un premier plan et je veux un fond défilant à une vitesse différente), mais il défile 1: 1 avec mon à l'avant-plan, il ne semble donc pas correct, et la plus grande partie est coupée (parce que c'est plus gros). Et j'ai essayé différentes valeurs z pour l'arrière-plan et divers plans de clipping proches/lointains ... c'est toujours pareil. Je fais probablement juste une chose simple fausse, mais je ne peux pas comprendre dehors. Je me demande si cela a à voir avec moi en utilisant seulement 2 coordonnées dans glVertexPointer pour le premier plan? (Bien sûr, pour le fond je passe en 3)

Je vais poster un code:

Ceci est une configuration initiale:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glEnableClientState(GL_VERTEX_ARRAY); 
//glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

//transparency 
glEnable (GL_BLEND); 
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

Un peu plus sur le réseau de flotteurs de mon premier plan .. ..il est entrelacé. Pour mon premier plan, il va au sommet x, au sommet y, à la texture x, à la texture y, à la répétition. Tout cela fonctionne très bien.

Ceci est mon rendu FOREGROUND:

glVertexPointer(2, GL_FLOAT, 4*sizeof(GLfloat), texes); <br> 
glTexCoordPointer(2, GL_FLOAT, 4*sizeof(GLfloat), (GLvoid*)texes + 2*sizeof(GLfloat)); <br> 
glDrawArrays(GL_TRIANGLES, 0, indexCount/4); 

CONTEXTE rendu:

exercice Même ici sauf que cette fois il va sommet x, sommet y, sommet z, texture x, texture y, répétition. Notez la valeur z cette fois. Je me suis assuré que les données de ce tableau étaient correctes pendant le débogage (obtenir les bonnes valeurs z). Et encore une fois, ça se voit ... ça ne va pas loin dans le lointain comme il se doit.

glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), b1Texes); 
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), (GLvoid*)b1Texes + 3*sizeof(GLfloat)); 
glDrawArrays(GL_TRIANGLES, 0, b1IndexCount/5); 

Et pour déplacer mon appareil photo, je fais juste un simple glTranslatef (x, y, 0.0f); Je ne comprends pas ce que je fais mal parce que cela semble être la fonction 3D la plus basique imaginable ... les choses plus éloignées sont plus petites et ne bougent pas aussi vite quand la caméra bouge. Pas le cas pour moi. On dirait que ça devrait être assez basique et même pas vraiment être affecté par ma projection et tout ça (même si j'ai même essayé de faire glFrustum juste pour m'amuser, pas de succès). S'il vous plaît, aidez, j'ai l'impression que c'est juste une chose stupide. Je posterai plus de code si nécessaire.

+0

Avez-vous activé depthBuffering? – Till

+0

Pour ajouter un depthbuffer voir ici http://www.memention.com/blog/2009/10/08/Think-deep.html – epatel

Répondre

0

J'ai compris que je suis en utilisant les projections orthographiques qui sont incapables d'afficher les choses étant plus loin (s'il vous plaît me corriger si je me trompe). Quand j'ai essayé glFrustum plus tôt (comme je l'ai dit dans ma question), je faisais quelque chose de mal avec la configuration de celui-ci. J'utilisais une valeur négative pour la valeur du quasi-écrêtage, et j'ai essentiellement le problème de défilement 1: 1, identique à celui orthographique. Mais j'ai changé cela à 0.01, et il a finalement commencé à s'afficher correctement (les arrière-plans affichés plus loin).

Mon problème est résolu mais juste comme une idée de côté, je me demande maintenant si je peux mélanger l'orthographe et la perspective dans le même cadre, et ce que cela exigerait. Parce que je préfère garder le premier plan très simple et orthographique (2d), mais je veux que mes arrière-plans s'affichent avec la profondeur de perspective.

Mon idée était quelque chose comme:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 

//render foreground 

glLoadIdentity(); 
glFrustum(-1.0f, 1.0f, -1.5f, 1.5f, 0.01f, 1000.0f); 

//render backgrounds 

je jouer avec cela et commenter avec mes résultats, au cas où quelqu'un est curieux. Des commentaires sur ce point seraient appréciés, bien que techniquement, je n'ai plus besoin de plus d'informations sur ce sujet (à partir de maintenant, ce serait juste une discussion d'idées).

0

Prise de vue dans l'obscurité ...

peut que vous deviez oublié de configurer la profondeur qui tamponnent dans le initialiseur framebuffer.

Copier Coller & anciens modèles de EAGLView d'Apple:

 

    glGenRenderbuffersOES(1, &depthRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
 
+0

J'utilise actuellement ce template. Je suis en train de tester sur un iPhone OS 2.2.1, et j'ai le SDK 3.0 ou quelque chose. Le code que vous avez écrit ici est incorporé dans une instruction "if (USE_DEPTH_BUFFER)", et j'ai USE_DEPTH_BUFFER # define'd comme 1. J'ai également débogué et vérifié que le code est appelé. Encore perplexe mais merci pour la suggestion. Suis-je en train d'oublier un aperçu de quelque chose? –

0

Si vous dépendez vous devez dessiner le mélange pour la profondeur, ce qui signifie tirer le plus (le plus profond) première couche. Sinon, ils seront couverts par la couche supérieure lorsque la valeur du tampon z est écrite même si la zone est transparente à 100%.

Voir here