2010-12-26 4 views
3

J'apprends comment utiliser OpenGL ES 2.0 sur iOS. En ce moment, je veux juste faire une animation 2D de base (par exemple déplacer un rectangle autour de l'écran et changer sa taille). J'ai commencé avec le modèle de projet pour OpenGL ES fourni par Apple dans Xcode. Mon code de dessin ressemble à ceci:Dessin 2D En OpenGL ES 2.0 (iOS)

static GLfloat squareVertices[] = { 
    -0.5f, -0.33f, 
    0.5f, -0.33f, 
    -0.5f, 0.33f, 
    0.5f, 0.33f 
}; 

// Update attribute values. 
glVertexAttribPointer(VERTEX_ATTR, 2, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(VERTEX_ATTR); 

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors); 
glEnableVertexAttribArray(COLOR_ATTR); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); 

Maintenant, cela va dessiner un nice rectangle au milieu de l'écran. Mais si je commence à changer le rectangle en ajoutant le code suivant, il commence à look funky:

squareVertices[5] -= .001; 
squareVertices[7] -= .001; 

Il est comme si une partie du rectangle est fixé au centre de l'écran. Je suis complètement nouveau à OpenGL ES donc je suis sûr que mon problème est évident. Je suppose également que cela a quelque chose à voir avec OpenGL ES étant une bibliothèque graphique 3D et j'essaie de le traiter comme un espace 2D. Donc ma question est: Quelle est la meilleure façon de dessiner et d'animer des objets 2D dans OpenGL ES 2.0? J'ai vu des choses en ligne pour OpenGL ES 1.1, mais cela ne m'aide pas beaucoup. Est-ce que leurs techniques spéciales pour le dessin 2D dans OpenGL ES 2.0, ou existe-t-il une sorte de mode de dessin 2D?

Toute indication serait grandement appréciée.

Répondre

6

@macinjosh: Ceci est une réponse à votre question mise à jour pour ceux qui sont intéressés par la réponse. Je suppose que vous avez acquis de nouvelles connaissances depuis Dec '10 lorsque vous avez posté!

Les sommets OpenGL sont en 3D, pas en 2D. Pour être complètement véridiques, ils sont en réalité dans 4D puisqu'ils incluent aussi un composant 'w', mais pour l'instant, considérez cela comme une valeur 1.0 comme un vecteur homogène. En raison de leur 3D-Ness, sauf si vous ajoutez un composant 'z' dans un shader, vous devez en spécifier un en tant qu'attribut de vertex.

1

Après un certain jeu autour j'ai changé le code de dessin à ceci:

static GLfloat squareVertices[12] = { 
    -0.5f, -0.33f, 0.0, 
    0.5f, -0.33f, 0.0, 
    -0.5f, 0.33f, 0.0, 
    0.5f, 0.33f, 0.0 
}; 

// Update attribute values. 
glVertexAttribPointer(VERTEX_ATTR, 3, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(VERTEX_ATTR); 

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors); 
glEnableVertexAttribArray(COLOR_ATTR); 

squareVertices[7] -= .001; 
squareVertices[10] -= .001; 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Ajout du troisième flotteur 0.0 à chaque sommet semblait faire l'affaire. Je ne comprends pas pourquoi il en est ainsi si quelqu'un pouvait faire la lumière, je l'apprécierais.

2

Je suis nouveau avec OpenGL, mais le vertex ne nécessite pas 3 float, un ax: X, Y, Z?

Ainsi, le premier tableau de vertex sera:

(-0.50f, -0.33f, 0.50f) 
(-0.33f, -0.50f, 0.33f) 
( 0.50f, 0.33f, ?????) 

le second sera:

(-0.50f, -0.33f, 0.00f) 
( 0.50f, -0.33f, 0.00f) 
(-0.50f, 0.33f, 0.00f) 
( 0.50f, 0.33f, 0.00f) 

Je suis vraiment un débutant, alors ne me prenez pas trop au sérieux ... :)

BTW, c'est la meilleure source de connaissances sur OpenGL j'ai trouvé:

http://iphonedevelopment.blogspot.com/2010/10/opengl-es-20-for-ios-chapter-3.html

espoir cette réponse est logique ...

+1

Ce blog est génial, mais cette série se termine après le quatrième chapitre. J'ai été vraiment déçu quand j'ai réalisé qu'il a arrêté :( – xaxxon

2

Parce que vous avez un « 3 » comme le troisième paramètre de glVertexAttribPointer. Je crois que vous pouvez le mettre à 2 mais je n'ai pas essayé cela dans GL. Ma conjecture est l'axe z manquant serait rempli en interne comme «0» (mais encore une fois, essayez-le et voir!). En interne, il s'agira probablement de 4 vecteurs flottants avec le paramètre 4 ('w') utilisé pour les gubbins de multiplication matricielle homogène. Si vous faites cela sur un appareil mobile, vous pouvez également vous intéresser aux maths en virgule fixe (plus rapide sur certains appareils qui n'ont pas de co-pro à virgule flottante) et aussi aux objets Vertex Buffer Objects, qui sont plus efficace sur beaucoup de machines. En outre, un format de sommet fixe tels que utilisé par

glInterleavedArrays(format_code, stride, data) 

peut se révéler plus efficace que le dispositif peut avoir optimisé les chemins de code pour tout « format_code » vous décidez d'aller avec.