2015-04-15 76 views
0

我目前在Windows 8上有一些與OpenGL開發有關的問題。我正在爲在Linux中工作的項目設置OpenGL。未處理的異常,glGenVertexArrays中的訪問衝突調用

我們在這個項目中同時使用glfw和glew。

我實際的問題是,glGenVertexArrays爲空,當它被稱爲它崩潰,我得到一個訪問衝突。 glGenVertexArrays不是使用被稱爲glew的第一個gl調用。

我聯繫GLEW和使用按照本教程的win32庫GLFW到Visual Studio項目:http://www.41post.com/5178/programming/opengl-configuring-glfw-and-glew-in-visual-cplusplus-express

下面的代碼是初始化代碼:

glfwSetErrorCallback(error_callback); 

    if (!glfwInit()) 
    { 
     LOG_FATAL << "Failed to init glfw context"; 
     exit(EXIT_FAILURE); 
    } 

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    m_window = glfwCreateWindow(1240, 480, "Rubix", NULL, NULL); 

    if (!m_window) 
    { 
     glfwTerminate(); 
     LOG_FATAL << "Failed to create glfw window"; 
     exit(EXIT_FAILURE); 
    } 

    glfwMakeContextCurrent(m_window); 

    #ifdef WIN32 
    //glewExperimental = GL_TRUE; 
    GLenum glewinit = glewInit(); 

    if (glewinit != GLEW_OK) 
    { 
     std::cout << "Glew not okay! " << glewinit; 
     exit(EXIT_FAILURE); 
    } 
    #endif 

    glfwSwapInterval(1); 
    glfwSetKeyCallback(m_window, key_callback); 

    LOG_INFO << "glfw OpenGL context ready"; 

    initGL(); 

下面的代碼被稱爲顯示立方體:

float points[] = { 
     0.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 1.0f, 0.0f, 1.0f, 
     0.0f, 1.0f, 0.0f, 1.0f, 
     0.0f, 0.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 1.0f, 
     0.0f, 1.0f, 1.0f, 1.0f 
    }; 

    float normals[] = { 
     0.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 1.0f, 0.0f, 1.0f, 
     0.0f, 1.0f, 0.0f, 1.0f, 
     0.0f, 0.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 1.0f, 
     0.0f, 1.0f, 1.0f, 1.0f 
    }; 

    unsigned short index_array[] = { 
     0, 3, 2, 
     0, 2, 1, 
     0, 1, 5, 
     0, 5, 4, 
     1, 2, 6, 
     1, 6, 5, 
     2, 3, 7, 
     2, 7, 6, 
     3, 0, 4, 
     3, 4, 7, 
     4, 5, 6, 
     4, 6, 7, 
    }; 

    GLuint points_vbo; 
    glGenBuffers (1, &points_vbo); 
    glBindBuffer (GL_ARRAY_BUFFER, points_vbo); 
    glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), points, GL_STATIC_DRAW); 

    GLuint normals_vbo; 
    glGenBuffers (1, &normals_vbo); 
    glBindBuffer (GL_ARRAY_BUFFER, normals_vbo); 
    glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), normals, GL_STATIC_DRAW); 

    GLuint index_buffer_object; 
    glGenBuffers (1, &index_buffer_object); 
    glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, index_buffer_object); 
    glBufferData (GL_ELEMENT_ARRAY_BUFFER, 48 * sizeof (unsigned short), index_array, GL_STATIC_DRAW); 

    glGenVertexArrays (1, &m_vao); 
    glBindVertexArray (m_vao); 
    glEnableVertexAttribArray (0); 
    glEnableVertexAttribArray (1); 

    glBindBuffer (GL_ARRAY_BUFFER, points_vbo); 
    glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, NULL); 
    glBindBuffer (GL_ARRAY_BUFFER, normals_vbo); 
    glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, NULL); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object); 

    glBindVertexArray(0); 

    // Creating program 

    Program program; 

    program.emplace_back("pos.vert", GL_VERTEX_SHADER); 
    program.emplace_back("smooth.frag", GL_FRAGMENT_SHADER); 

    program.link(); 

    program.clearShaders(); 

    m_program = program.getProgram(); 

我嘗試過glewExperimental = GL_TRUE;用這個代碼運行,但它不顯示任何東西。

我使用的GPU是nvidia GT 730M,它支持opengl 4.2。

我也跑了glewinfo.exe,說glGenVertexArrays應該是好的。 另外我注意到,當我打開位於Windows套件下的gl文件夾下的glcorearb.h位置(使用visual studio 2013)時,opengl中的大多數版本都灰顯,我認爲問題可能與此有關。

回答

0

好的,問題是視覺工作室沒有使用正確的GPU。爲了解決它,我進入了Nvidia控制面板 - >管理3D設置 - >程序設置,並添加了我的調試exe和發佈exe。

爲什麼它後,沒有工作的原因是,我忘了,嘗試一下與glewExperimental設置爲true。

設置完成後,我的問題得到解決。

0

您的代碼不檢查所需運行的先決條件得到滿足,因此它並沒有趕上的情況下,如果不充分的OpenGL環境是存在的。很可能OpenGL驅動程序安裝不正確,這就是爲什麼GLEW無法初始化所需的函數指針。

注意,微軟正在破壞OpenGL和除掉了OpenGL ICD在通過Windows Update或初始Windows安裝程序安裝的驅動程序。請仔細檢查,您已直接從NVidia網站下載的驅動程序已正確安裝。

+0

我已經通過Nvidia的工具GeForce Experience安裝了我的驅動程序。他們是我的GPU的最新驅動程序。 –

+0

我只是測試和glGetString(GL_VENDOR);」返回儘管我確實改變在NVIDIA控制面板中的設置實際使用它,而不是英特爾集成GPU ...... –

+0

英特爾,我在NVIDIA的控制面板設置是爲釋放.exe,我用debug .exe進行了測試。我在配置文件中添加了debug .exe,並且仍然崩潰。 –

相關問題