2010-06-26 2 views
4

Désolé pour la duplication, mais je suis allé googlin 'pendant des heures maintenant sans aucun résultat.Quelqu'un pourrait-il expliquer comment utiliser glDrawElements (iPhone)?

je ces données (optimisé) d'un simple cube exporté d'un convertisseur:

// 8 Verticies 
// 4 Texture Coordinates 
// 6 Normals 
// 12 Triangles 

static GLshort cubeFace_indicies[12][9] = { 
    // Box001 
    {2,0,3 ,0,0,0 ,0,1,2 }, {1,3,0 ,0,0,0 ,3,2,1 }, {5,4,7 ,1,1,1 ,1,3,0 }, 
    {6,7,4 ,1,1,1 ,2,0,3 }, {1,0,5 ,2,2,2 ,1,3,0 }, {4,5,0 ,2,2,2 ,2,0,3 }, 
    {3,1,7 ,3,3,3 ,1,3,0 }, {5,7,1 ,3,3,3 ,2,0,3 }, {2,3,6 ,4,4,4 ,1,3,0 }, 
    {7,6,3 ,4,4,4 ,2,0,3 }, {0,2,4 ,5,5,5 ,1,3,0 }, {6,4,2 ,5,5,5 ,2,0,3 } 
}; 
static GLfloat cubeVertices [8][3] = { 
    {-100.0f,-100.0f,-100.0f},{100.0f,-100.0f,-100.0f},{-100.0f,100.0f,-100.0f}, 
    {100.0f,100.0f,-100.0f},{-100.0f,-100.0f,100.0f},{100.0f,-100.0f,100.0f}, 
    {-100.0f,100.0f,100.0f},{100.0f,100.0f,100.0f} 
}; 
static GLfloat cubeNormals [6][3] = { 
    {0.0f,0.0f,1.0f},{0.0f,0.0f,-1.0f},{0.0f,1.0f,0.0f}, 
    {-1.0f,0.0f,0.0f},{0.0f,-1.0f,0.0f},{1.0f,0.0f,0.0f} 
}; 
static GLfloat cubeTextures [4][2] = { 
    {1.0f,2.0f},{1.0f,1.0f},{0.0f,2.0f}, 
    {0.0f,1.0f} 
}; 

J'ai une texture mis en place, et je veux voir quelque chose sur l'écran. Mon code récent dessin ci-dessous:

glTexCoordPointer(2, GL_FLOAT, 0, cubeTextures); 
glVertexPointer(3, GL_FLOAT, 0, cubeVertices); 
glNormalPointer(GL_FLOAT, 0, cubeNormals); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 

    glDrawElements(GL_TRIANGLES , 12, GL_SHORT, cubeFace_indicies); 
+0

Et bien sûr, cela ne fonctionne pas. – Geri

+0

Quels appels glEnable() avez-vous faits? –

+0

glEnable (GL_TEXTURE_2D); glEnable (GL_BLEND); glEnable (GL_DEPTH_TEST); – Geri

Répondre

5

données Index en OpenGL ES (et OpenGL standard) ne fonctionne pas comme vous l'utilisez. Plutôt que de fournir des index séparés par sommet pour les coordonnées position, normale et texture, vous fournissez un seul index i et OpenGL ES prend l'élément i à partir de chacun des tableaux de vertex activés. Cela signifie que vous aurez besoin d'indices séparés pour toutes les combinaisons vertex-normal-texcoord que vous avez créées dans votre représentation actuelle, ce qui peut nécessiter de dupliquer légèrement vos données.

Vous pourriez être en mesure de vous en sortir en spécifiant moins de points uniques si votre modèle peut être dessiné avec un ombrage plat (c'est-à-dire en appelant glShadeModel(GL_FLAT) avant de dessiner). Dans ce cas, la normale du dernier sommet d'un triangle sera utilisée pour le triangle entier. Cela nécessite une commande soigneuse de vos indices, bien sûr.

+0

Merci de le préciser. Mais si c'est vrai, alors pourquoi 3D Exploring exporte-t-il des tableaux comme ça? Je ne peux pas comprendre. Quoi qu'il en soit, PolyTrans exporte comme vous l'avez décrit, et cela fonctionne bien évidemment. – Geri

0

à utiliser glDrawArrays vous devez activer l'état GL_VERTEX_ARRAY avec glEnableClientState (GL_VERTEX_ARRAY) puis créer chaque point de sommet avec glVertexPointer (3, GL_FLOAT, 0,)

+0

J'ai mal saisi le titre. La question est sur glDrawElements, maintenant j'ai mis à jour. – Geri

Questions connexes