2017-09-06 5 views
-1

Ceci est ma première fois en utilisant OpenGL, donc cela peut être une question stupide, mais mon code tire une erreur GL_INVALID_OPERATION (1218 ou 0x0502) entre glBegin() et glEnd() . Je n'appelle que quelques commandes simples, mais glGetError() renvoie 0 au début de cette fonction et 1218 à la fin.erreur GL_INVALID_OPERATION 1218 (0x0502) lors de l'utilisation de simples commandes OpenGL glVertex2i, glColor3ub

Cette fonction est destinée à être utilisée pour dessiner une seule instance de n'importe quelle forme simple, et après avoir parcouru le débogueur, les variables sont ce que je voulais qu'elles soient. Notez également que, malgré cette question stupide, j'ai passé plusieurs heures hier soir et plusieurs heures aujourd'hui à chercher dans Google et mon manuel des solutions possibles, et n'ai rien trouvé d'utile en raison de la nature vague des erreurs OpenGL.

void drawShape(GLenum type, int numPoints, GLubyte r, GLubyte g, GLubyte b, vertex vertices, ...) { 
    glBegin(type); 
    glColor3ub(r, g, b); 

    // iterate through vertices 
    va_list vertexList; 
    va_start(vertexList, vertices); // use vertexList for iteration 
    for (int i = 0; i < numPoints; ++i) { 
     vertex point = i == 0 ? vertices : va_arg(vertexList, vertex); 
     // add a new point at (x, y) 
     glVertex2i(std::get<0>(point), std::get<1>(point)); 
    } 
    glEnd(); 
} 

Cette fonction est appelée comme suit:

drawShape(GL_LINE, 2, 0, 0, 0, vertex{ 10, 10 }, vertex{ 400, 10 }); 

Et le contexte que je utilise est Freeglut qui est initialisé comme suit:

// gross workaround for calling init with no arguments 
int argc = 1; 
char *argv[1] = { (char*)"" }; 
glutInitContextVersion(4, 1); 
glutInit(&argc, argv); 
// RGB window, double buffer 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
// sets values necessary for window initialization 
glutInitWindowPosition(INIT_X, INIT_Y); 
glutInitWindowSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 

// draw the window and create the scene 
glutCreateWindow(WORKING_WINDOW_TITLE); 
glClearColor(1, 1, 1, 1); // set clear color to white 
glutDisplayFunc(render); 
glutMainLoop(); 
+1

Veuillez montrer un exemple minimal, complet et vérifiable. Avez-vous même un contexte valide? Avec quels paramètres appelez-vous la fonction? – BDL

+0

Utilisez-vous un contexte de base? Deuxièmement, le contexte "actuel" de votre contexte OpenGL lorsque votre fonction est appelée? – Robinson

+0

@BDL J'appelle la fonction comme suit: 'drawShape (GL_LINE, 2, \t \t 0, 0, 0, \t \t sommet {10, 10}, \t \t sommet {400, 10}) ; ' – AdumbCopper

Répondre

2

Le problème réside dans l'appel à glBegin lui-même. GL_LINE n'est pas un paramètre valide pour cette fonction. Pour cette raison, toutes les commandes suivantes ne sont pas appelées dans un bloc glBegin/glEnd valide.

Si vous souhaitez dessiner des lignes, le paramètre correct est GL_LINES. La première étape lors du débogage d'une application OpenGL qui ne prend pas en charge un contexte de débogage doit toujours être d'identifier quel appel de fonction produit la première erreur. Cela peut, par exemple, être fait en appelant glGetError() après chaque appel OpenGL jusqu'à ce que la ligne problématique est trouvée. Notez également que glError renvoie des erreurs dans l'ordre arbitraire si plus d'une erreur s'est produite.

+0

Donc je devrais simplement changer le premier paramètre de l'appel de fonction à 'GL_LINES'? J'ai essayé et j'ai eu la même erreur. – AdumbCopper

+0

Je reçois aussi le même problème lors de l'appel 'drawShape (GL_POLYGON, 4, \t \t 0, 50, 200, \t \t sommet {10, 200}, \t \t sommet {110, 200}, \t \t sommet { 10, 400}, \t \t vertex {110, 400}); ' – AdumbCopper

+0

Vous devez commencer par modifier ce paramètre, puis identifier la ligne qui cause exactement l'erreur. – BDL