Le meilleur moyen que j'ai trouvé pour y parvenir est d'utiliser des VAO en plus des VBO.
Je vais d'abord répondre à votre question en utilisant uniquement les VBO.
Tout d'abord, supposons que les deux maillages de vos deux objets sont stockés dans les tableaux suivants :
GLuint _vertexBufferCube1;
GLuint _vertexBufferCube2;
où :
GLfloat gCubeVertexData1[36] = {...};
GLfloat gCubeVertexData2[36] = {...};
Et vous devez également utiliser des tampons vertix :
GLuint _vertexBufferCube1;
GLuint _vertexBufferCube2;
Maintenant, pour dessiner ces deux cubes (sans VAOs), vous devez faire quelque chose comme ça : dans la fonction draw (du modèle OpenGLES) :
//Draw first object, bind VBO, adjust your attributes then call DrawArrays
glGenBuffers(1, &_vertexBufferCube1);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferCube1);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData1), gCubeVertexData1, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glDrawArrays(GL_TRIANGLES, 0, 36);
//Repeat for second object:
glGenBuffers(1, &_vertexBufferCube2);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferCube2);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData2), gCubeVertexData2, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glUseProgram(_program);
glDrawArrays(GL_TRIANGLES, 0, 36);
Cela répondra à votre question. Mais maintenant pour utiliser les VAOs, le code de votre fonction draw est beaucoup plus simple (ce qui est bien car c'est la fonction répétée) :
Vous allez d'abord définir les VAO :
GLuint _vertexArray1;
GLuint _vertexArray2;
et ensuite vous ferez toutes les étapes précédemment effectuées dans la méthode draw, vous le ferez dans la fonction setupGL mais après la liaison avec le VAO. Ensuite, dans votre fonction de dessin, il vous suffit de vous lier au VAO de votre choix.
VAO est ici comme un profil qui contient beaucoup de propriétés (imaginez un profil de dispositif intelligent). Au lieu de changer la couleur, le bureau, les polices, etc. à chaque fois que vous souhaitez les modifier, vous le faites une fois et l'enregistrez sous un nom de profil. Ensuite, il suffit de changer de profil.
Vous le faites donc une fois, dans setupGL, puis vous passez de l'un à l'autre dans draw.
Bien sûr, vous pouvez dire que vous auriez pu mettre le code (sans VAO) dans une fonction et l'appeler. C'est vrai, mais les VAO sont plus efficaces selon Apple :
http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW1
Passons maintenant au code :
Dans le setupGL :
glGenVertexArraysOES(1, &_vertexArray1); //Bind to first VAO
glBindVertexArrayOES(_vertexArray1);
glGenBuffers(1, &_vertexBufferCube1); //All steps from this one are done to first VAO only
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferCube1);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData1), gCubeVertexData1, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glGenVertexArraysOES(1, &_vertexArray2); // now bind to the second
glBindVertexArrayOES(_vertexArray2);
glGenBuffers(1, &_vertexBufferCube2); //repeat with the second mesh
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferCube2);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData2), gCubeVertexData2, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glBindVertexArrayOES(0);
Et enfin dans votre méthode de dessin :
glBindVertexArrayOES(_vertexArray1);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArrayOES(_vertexArray2);
glDrawArrays(GL_TRIANGLES, 0, 36);