OpenGL glGenVertexArray()异常 我现在用C++学习OpenGL,使用SDL、GLW和GLM。我已经到了“VAO和VBO”阶段。然而,我得到了一个错误。当我运行我的程序时,我在LearningOpenGL.exe:0xC0000005:访问冲突执行位置0x00000000中的0x74DECB49处得到一个异常:未处理的异常。有一个箭头指向行glgenvertexarray,我初始化了SDL,创建了一个OpenGL上下文,并使用OpenGL 3.0+

OpenGL glGenVertexArray()异常 我现在用C++学习OpenGL,使用SDL、GLW和GLM。我已经到了“VAO和VBO”阶段。然而,我得到了一个错误。当我运行我的程序时,我在LearningOpenGL.exe:0xC0000005:访问冲突执行位置0x00000000中的0x74DECB49处得到一个异常:未处理的异常。有一个箭头指向行glgenvertexarray,我初始化了SDL,创建了一个OpenGL上下文,并使用OpenGL 3.0+,c++,opengl,sdl,glew,C++,Opengl,Sdl,Glew,这里是Display.cpp(初始化所有内容) 这是Game.cpp #include "Game.h" Game::Game() { _display = Display(_displayWidth, _displayHeight, _displayTitle); // TODO: Fix Hardcoded 3 below _vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f)); _vertices[1]

这里是Display.cpp(初始化所有内容)

这是Game.cpp

#include "Game.h"

Game::Game()
{
    _display = Display(_displayWidth, _displayHeight, _displayTitle);

    // TODO: Fix Hardcoded 3 below

    _vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f));
    _vertices[1] = Vertex(glm::vec3(1.0f, -1.0f, 0.0f));
    _vertices[2] = Vertex(glm::vec3(0.0f, 1.0f, 0.0f));

    _mesh = Mesh(_vertices, 3);

}

Game::~Game()
{

}

void Game::init()
{
    _display.createDisplay();
}

void Game::gameLoop()
{
    while (!_display.isClosed())
    {
        glClearColor(0.0f, 0.15f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        _mesh.render();

        _display.update();
    }
    _display.destroyDisplay();
}

void Game::start()
{
    init();
    gameLoop();
}

我读过关于这个问题的其他帖子,它们的解决方案似乎是“设置glewExperimental=GL_TRUE”。正如您所看到的,我这样做了,但仍然是例外。当我将旧的图形管道与OpenGL一起使用时,它起了作用。然而,现在情况并非如此。我使用的是OpenGL 3.0+,那么问题出在哪里?

您是否按正确的顺序调用这些类过程?比如它真的在生成数组之前创建了上下文吗?我也有同样的问题,这就是原因。
如果您有一段时间没有更新图形驱动程序,您也可以尝试更新图形驱动程序。崩溃数据表明,
glgenvertexarray()
函数不可用,这很可能是您的GLEW/SDL设置有问题

然而,代码中还有一个微妙但非常关键的问题。我不认为它会导致崩溃,但它肯定会阻止它工作。这条线是:

_mesh = Mesh(_vertices, 3);
在这里,将(新构造的)
网格
实例指定给变量。这条线上发生的情况如下:

  • 将创建一个新的
    网格
    对象
  • 构造函数被调用。在构造函数中创建VAO和其他OpenGL对象
  • 新对象被指定给
    \u mesh
    变量。由于您的
    Mesh
    类未定义赋值运算符,因此将使用默认的按成员赋值
  • 由于新创建的
    Mesh
    实例仅存在于语句中,因此它将被销毁
  • 调用对象的析构函数。在析构函数中,删除VAO
  • 因此,在本声明末尾,您的VAO已被删除。您仍然将VAO id存储在
    \u mesh
    变量的成员中,但该id现在无效

    <> > C++类中的OPENL对象通常会导致麻烦,如果你对C++没有把握,并且完全理解如何实现正确的拷贝和赋值语义。
    我在这里对类似问题的回答中详细阐述了解决此类问题的一些选项:。最直接的方法是不允许复制这些类型的对象,并在整个代码中使用(智能)指针引用它们。

    好吧,从目前发布的代码来看,我一点也不清楚您是否使用OpenGL>=3.0。你当然不会在任何地方要求它。所以确保你真的得到了。另一个选项是在创建上下文(并初始化glew)之前调用网格构造函数。它输出:3.1.0构建8.15.10.2618;我还将更新上面的问题以显示我的游戏类。
    #include "Game.h"
    
    Game::Game()
    {
        _display = Display(_displayWidth, _displayHeight, _displayTitle);
    
        // TODO: Fix Hardcoded 3 below
    
        _vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f));
        _vertices[1] = Vertex(glm::vec3(1.0f, -1.0f, 0.0f));
        _vertices[2] = Vertex(glm::vec3(0.0f, 1.0f, 0.0f));
    
        _mesh = Mesh(_vertices, 3);
    
    }
    
    Game::~Game()
    {
    
    }
    
    void Game::init()
    {
        _display.createDisplay();
    }
    
    void Game::gameLoop()
    {
        while (!_display.isClosed())
        {
            glClearColor(0.0f, 0.15f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
    
            _mesh.render();
    
            _display.update();
        }
        _display.destroyDisplay();
    }
    
    void Game::start()
    {
        init();
        gameLoop();
    }
    
    _mesh = Mesh(_vertices, 3);