使用glCreateBuffers

时间:2017-10-08 16:51:13

标签: c++ visual-studio opengl nvidia

我正在尝试OpenGL Red book examples。我能够在MS VS 2017中编译项目。但是,当我执行一些示例时,它会抛出以下异常。

  

Project_1_1.exe中的0x00000000处抛出异常:0xC0000005:Access   违规执行位置0x00000000。发生

这行发生了:

glCreateBuffers( NumBuffers, Buffers );

如果GPU支持OpenGL 4.5,我已经从阅读论坛了解到glCreateBuffers有效。我尝试使用glGenBuffers,确实有效。

我跑了glewinfo,它显示我缺少GL_VERSION_4_5和GL_ARB_direct_state_access。所以看来我的GPU不支持OpenGL 4.5。

但是,我有Nvidia GTX 1050和更新的驱动程序,根据文档,它应该支持OpenGL 4.5。 Steam中的系统信息显示4.5 OpenGL支持。我在Linux中编译时代码工作正常。我需要使用OpenGL 4.5。

相关细节:

  1. Windows 10
  2. 戴尔XPS 15与i7 7700 HQ
  3. Nvidia GTX 1050
  4. Visual Studio 2017
  5. 我是第一次在Windows上编译代码,所以我可能会遗漏一些明显的东西。这些代码适用于Ubuntu 16.04。

    修改(已添加代码) 代码的相关部分来自this repository

    //////////////////////////////////////////////////////////////////////////////
    //
    //  Triangles.cpp
    //
    //////////////////////////////////////////////////////////////////////////////
    
    #include "vgl.h"
    #include "LoadShaders.h"
    
    enum VAO_IDs { Triangles, NumVAOs };
    enum Buffer_IDs { ArrayBuffer, NumBuffers };
    enum Attrib_IDs { vPosition = 0 };
    
    GLuint  VAOs[NumVAOs];
    GLuint  Buffers[NumBuffers];
    
    const GLuint  NumVertices = 6;
    
    //----------------------------------------------------------------------------
    //
    // init
    //
    
    void
    init( void )
    {
        glGenVertexArrays( NumVAOs, VAOs );
        glBindVertexArray( VAOs[Triangles] );
    
        GLfloat  vertices[NumVertices][2] = {
            { -0.90f, -0.90f }, {  0.85f, -0.90f }, { -0.90f,  0.85f },  // Triangle 1
            {  0.90f, -0.85f }, {  0.90f,  0.90f }, { -0.85f,  0.90f }   // Triangle 2
        };
    
        glCreateBuffers( NumBuffers, Buffers );
        glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
        glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);
    
        ShaderInfo  shaders[] =
        {
            { GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
            { GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
            { GL_NONE, NULL }
        };
    
        GLuint program = LoadShaders( shaders );
        glUseProgram( program );
    
        glVertexAttribPointer( vPosition, 2, GL_FLOAT,
                               GL_FALSE, 0, BUFFER_OFFSET(0) );
        glEnableVertexAttribArray( vPosition );
    }
    
    
    //----------------------------------------------------------------------------
    //
    // display
    //
    
    void
    display( void )
    {
        static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
    
        glClearBufferfv(GL_COLOR, 0, black);
    
        glBindVertexArray( VAOs[Triangles] );
        glDrawArrays( GL_TRIANGLES, 0, NumVertices );
    }
    
    //----------------------------------------------------------------------------
    //
    // main
    //
    
    #ifdef _WIN32
    int CALLBACK WinMain(
      _In_ HINSTANCE hInstance,
      _In_ HINSTANCE hPrevInstance,
      _In_ LPSTR     lpCmdLine,
      _In_ int       nCmdShow
    )
    #else
    int
    main( int argc, char** argv )
    #endif
    {
        glfwInit();
    
        GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);
    
        glfwMakeContextCurrent(window);
    
        int api, major, minor, revision, profile;
    
        api = glfwGetWindowAttrib(window, GLFW_CLIENT_API);
        major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
        minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
        revision = glfwGetWindowAttrib(window, GLFW_CONTEXT_REVISION);
        profile = glfwGetWindowAttrib(window, GLFW_OPENGL_PROFILE);
    
        gl3wInit();
    
        init();
    
        while (!glfwWindowShouldClose(window))
        {
            display();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    
        glfwDestroyWindow(window);
    
        glfwTerminate();
    }
    

1 个答案:

答案 0 :(得分:2)

如果您确定您的图形卡支持OpenGL 4.5,那么应该检查几件事情:

  • 确保您的应用程序实际请求OpenGL 4.5上下文(例如,为此设置正确的glfwWindowHint
  • 确保应用程序使用正确的卡。这尤其是笔记本电脑的问题,包括专用GPU(AMD或NVidia)和英特尔集成的GPU。此设置应位于Nvidia控制面板或AMD等效控制面板中。