2013-02-27 2 views
2

J'essaie de passer par les tutoriels ArcSynthesis sur OS X, et je reçois l'erreur OpenGL "Opération invalide" après avoir appelé glEnableVertexAttribArray. J'ai vérifié que j'ai un lien VBO, par la discussion au glEnableClientState and glEnableVertexAttribArray, et je ne suis pas sûr de ce qu'il faut vérifier ensuite. J'utilise OS X 10.8, le profil OpenGL 3.2 et Xcode 4.6. J'essaie d'écrire une classe qui va charger dans les fichiers de modèle XML utilisés dans les tutoriels, et je pense que je fais les mêmes opérations dans le même ordre qu'un programme précédent qui dessine un codé dans le modèle. Mais je dois faire quelque chose de différent ou de mal en quelque sorte, et je n'arrive pas à comprendre quoi. En se référant à la documentation OpenGL 3.2, on dit que vous obtenez une opération invalide en envoyant une valeur d'index supérieure au maximum autorisé par l'implémentation OpenGL, mais j'utilise 0 et 1, que j'ai déjà utilisés.glEnableVertexAttribArray donne une opération invalide

Voici le code, avec toutes les erreurs OpenGL vérification éditée pour plus de clarté:

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 
    for (int iAttribLoop = 0; iAttribLoop < [attributeAnalyzers count]; iAttribLoop++) { 
     AttributeAnalyzer *theAnalyzer = [attributeAnalyzers objectAtIndex:iAttribLoop]; 
     GLuint theIndex = [theAnalyzer index]; 
     NSLog(@"theIndex is %d", theIndex); 
     glEnableVertexAttribArray(theIndex); 
     glVertexAttribPointer(theIndex, [theAnalyzer size], theType, GL_FALSE, 0, dataOffset); 
     dataOffset += sizeof(theType)*[theAnalyzer size]*[theAnalyzer vertexCount]; 
    } 

Répondre

6

Se référant à la documentation OpenGL 3.2 dit que vous obtenez une opération non valide en envoyant une valeur d'index sur le maximum autorisé par l'implémentation OpenGL

Non, ce n'est pas le cas. Faire cela vous donne GL_INVALID_VALUE. GL_INVALID_OPERATION est donné par glEnableVertexAttribArray seulement when you call it and no VAO is bound.

Donc, vous devriez probablement faire cela.

+0

C'était l'indice dont j'avais besoin! Il se trouve que je me suis fait mordre par le multi-threading - la routine de dessin était de désengager le VAO avant que la méthode de construction du VAO ne soit terminée. La routine de dessin n'a pas besoin de jouer avec le VAO dans ce programme, alors je me suis débarrassé de cette ligne et j'ai réglé les choses. On dirait que je vais devoir étudier le threading ainsi que OpenGL ... Merci! –

Questions connexes