3

glew init が終了した直後、および他の gl コマンドが呼び出される前に glGetError を呼び出すと、GL_INVALID_ENUM コードを取得しています。私のグラフィック カードは GeForce 550GT で、OpenGL 4.2 を搭載した最新のドライバーが搭載されています。 glDrawArrays() を呼び出すと GL_INVALID_OPERATION が発生しますが、理由がわかりません。この作業はすべてミニ レンダリング エンジンですが、現在はパイプラインです。非常に単純なので、何が問題なのか理解できません。コンテキストとウィンドウを初期化する方法は次のとおりです。

 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);
}

これは 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

   }

私が言ったように、すべてのバッファとシェーダ プログラムは問題なく初期化されています。更新:わかりました、最初の問題の答えが見つかりました:

GlewInit の後に GL_INVALID_ENUM が発生する可能性があり、レンダリングを台無しにすることは想定されていないようです.だから、2番目の問題が残っています...

更新1:

VBO で glDrawArrays() を呼び出すときに GL_INVALID_ENUM の回避策を見つけました。VBO を VAO にパックすると、エラーが消え、レンダリングが機能します。それは、前方互換性のあるコア プロファイルでは、VBO を直接使用して描画できないことを意味しますか?公式ドキュメントでそれに関連するものを見ました。

4

1 に答える 1

5

コア プロファイルでは、頂点配列オブジェクトはオプションではありません。エラーはおそらく別のGL_INVALID_ENUM場所から発生しています。あなたは得ているはずですGL_INVALID_OPERATION。覚えておいてください: OpenGL エラーはバッファリングされるため、戻ってくるまで GL エラーをフェッチし続ける必要がありますGL_NO_ERROR

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);

これをやめてください。コア プロファイルでは、前方互換性は実質的に無意味です。

于 2012-12-02T16:32:08.877 に答える