2010-12-10 3 views
5

J'essaye de dessiner des objets 3D qui ont plus de 65536 vertices sur l'iPad, mais je n'arrive pas à comprendre ce que je fais de mal. Mon modèle d'origine qui utilisait GL_UNSIGNED_SHORT fonctionnait très bien, mais maintenant avec GL_UNSIGNED_INT, je n'arrive à rien avec la commande glDrawElements. C'est comme si le rendu ignorait complètement ma ligne glDrawElements. La partie de ma boucle de rendu que je fais référence est ci-dessous:Comment utilisez-vous glDrawElements avec GL_UNSIGNED_INT pour les indices?

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

glVertexPointer(3, GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]); 
glNormalPointer(GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]); 

for (int i = 0; i < assemblyObj->numObjects; i++) 
{ 
    glDrawElements(GL_TRIANGLES, assemblyObj->partList[i].faceArray.size(), GL_UNSIGNED_INT, &assemblyObj->partList[i].faceArray[0]); 
} 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

sommets est défini comme:

vector<float> vertices; 

et chaque faceArray est défini comme:

vector<UInt32> faceArray; 

Toutes les suggestions sur qu'est-ce que je fais de mal qui empêche ma géométrie de dessiner?

Répondre

7

Stock OpenGL ES ne prend pas en charge GL_UNSIGNED_INT pour les indices.

De l'GLES glDrawElements man page:

GL_INVALID_ENUM est généré si le type ne GL_UNSIGNED_BYTE ou GL_UNSIGNED_SHORT.

Cette restriction est assouplie lorsque GL_OES_element_index_uint est pris en charge.

Si vous ne disposez pas de support sur la plate-forme cible, le mieux est de doter votre maillage en plusieurs sous-maillages avec < 64K indices pour chacun. En ce qui concerne ipad spécifiquement, pour autant que je sache, iOS does not support this extension (voir extensions prises en charge), mais vous pouvez vérifier la liste des extensions sur le périphérique réel si vous voulez vous assurer.

+0

Est-ce que cela est plus rapide que de dessiner avec glDrawArrays? Je peux faire la même chose que je fais maintenant avec glDrawArrays, mais je veux rendre le plus de FPS possible. – Davido

+0

Je l'ai compris, je rends juste chaque objet en utilisant son propre tableau de vertex et ça fonctionne très bien. Je rends environ 125.000 sommets avec un total de 90 modèles et il est utilisable, rend environ 12 images par seconde. Maintenant, j'essaie juste de comprendre s'il y a quelque chose que je peux faire pour accélérer le rendu. Aucune suggestion? – Davido

+3

Cette réponse est incorrecte, 'GL_UNSIGNED_INT' est supporté pour' glDrawElements' si 'GL_OES_element_index_uint' est implémenté (ce qui est dans iOS, d'après ). –

Questions connexes