3 Stimmen

GL_INVALID_ENUM direkt nach der Kontextinitialisierung

Ich bekomme GL_INVALID_ENUM Code, wenn ich glGetError aufrufe, direkt nachdem glew init beendet wurde und bevor ein anderer gl Befehl aufgerufen wurde.Ich stelle OpenGL 4.2 CORE ein, vorwärtskompatibel.Ich benutze GLFW für Fenster/Eingabe und GLEW für den gl Kontext und das alles läuft auf Windows 7 64bit.Meine Grafikkarte ist GeForce 550GT, die die neuesten Treiber mit OpenGL 4.2 hat.Eine andere seltsame Sache ist, dass ich glDrawElements() benutzte, was gut funktionierte. Aber dann habe ich versucht, glDrawArrays(), die ich für einige spezifische Aufgabe benötigt, und es funktionierte überhaupt nicht.Ich doppelt überprüft alle gl Syntax, Puffer Kreationen Shader etc.Nothing.I bekommen GL_INVALID_OPERATION beim Aufruf glDrawArrays() und ich habe keine Ahnung, warum.All diese Arbeit ist ein Mini-Render-Engine, aber derzeit die Pipeline ist wirklich einfach, so kann ich nicht verstehen, was das Problem sein kann.Here ist, wie ich den Kontext und Fenster zu initialisieren:

 void Engine::InitWithGLFW(){

    if(!glfwInit()){
        exit(EXIT_FAILURE);
    }
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwOpenWindowHint(GLFW_FSAA_SAMPLES,0);
    glfwDisable( GLFW_AUTO_POLL_EVENTS );

 #ifdef DEBUG
    glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
 #endif

    if(!glfwOpenWindow(_width,_height,8, 8, 8, 8, 24, 8,GLFW_WINDOW)){
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwSetWindowTitle("XDEngine V-1.0");
    InitGlew();

}

void  Engine::InitGlew(){
    glewExperimental=GL_TRUE;
    GLenum err = glewInit(); 

    if (GLEW_OK != err)
    {
        /* Problem: glewInit failed, something is seriously wrong. */
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

    }

    fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));

    glEnable(GL_MULTISAMPLE);
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_DEPTH_TEST);
    glDepthMask(true);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0f, 1.0f);
    glEnable(GL_DEPTH_CLAMP);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glfwSetWindowSizeCallback(Reshape);
}

Und dies ist die Rendering-Schleife für glDrawArrays():

     void Draw(){
            _material->Draw();///activate shader program
            glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
            _material->PostDraw();  //deactivate shader program

   }

Wie ich schon sagte, sind alle Puffer und Shader-Programme korrekt initialisiert. UPDATE: Ok , ich habe gefunden die Antwort für die erste Ausgabe:

Scheint wie GL_INVALID_ENUM kann nach GlewInit passieren und es soll nicht das Rendering zu schrauben.so bin ich mit dem zweiten Problem links...

UPDATE1:

Ich habe den Workaround für GL_INVALID_ENUM gefunden, wenn ich glDrawArrays() mit VBO aufrufe. wenn ich das VBO in VAO packe, verschwindet der Fehler und das Rendering funktioniert. bedeutet das, dass wir im vorwärtskompatiblen Kernprofil nicht direkt mit VBO zeichnen können?

5voto

Nicol Bolas Punkte 409659

Vertex-Array-Objekte sind nicht optional im Kernprofil. Die GL_INVALID_ENUM Fehler kommt wahrscheinlich von woanders her; Sie sollten Folgendes erhalten GL_INVALID_OPERATION . Erinnern Sie sich: OpenGL-Fehler werden gepuffert, so dass Sie GL-Fehler so lange abrufen müssen, bis Sie wieder mit GL_NO_ERROR .

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);

Bitte hören Sie auf, dies zu tun. Vorwärtskompatibilität ist praktisch bedeutungslos in einem Kernprofil.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X