【问题标题】:Access violation with glGenBuffers() with GLEW initialization in the correct orderglGenBuffers() 访问冲突,GLEW 初始化顺序正确
【发布时间】:2018-05-10 07:32:47
【问题描述】:

我听说在设置 GLEW 时,您必须在创建窗口上下文后对其进行初始化。我已经在下面这样做了,但问题是我仍然会通过调用 glGenBuffers() 来违反访问权限。错误检查也没有启动。是因为 GLEW 初始化的位置/我如何创建 RenderWindow?在没有类的情况下将代码放入 main() 函数就可以了。

Engine() : sf::RenderWindow(){
        // setup the SFML renderwindow
        string windowTitle = "OpenGL";

        sf::ContextSettings contextSettings;
        contextSettings.antialiasingLevel = 4;
        contextSettings.depthBits = 64;

        sf::RenderWindow::create(sf::VideoMode(800, 600), windowTitle, sf::Style::Resize | sf::Style::Close, contextSettings);

        // setup GLEW
        glewExperimental = GL_TRUE;
        GLenum err = glewInit();
        if(err != GLEW_OK){
            printf("ERROR: GLEW failed to initialize.\n");
            exit(1);
        }
        glViewport(0, 0, sf::RenderWindow::getSize().x, sf::RenderWindow::getSize().y);
        ...
}

【问题讨论】:

  • 请在一切正常的地方显示为主要功能

标签: c++ opengl sfml


【解决方案1】:

我想尝试不使用glewExperimental = GL_TRUE;。这在您在 Core 配置文件中创建 OpenGL 上下文并希望将其与 glew 一起使用时特别使用。与您的情况一样,您将默认保留在库上创建的上下文类型。默认情况下,此上下文主要由您的库的创建窗口函数创建,并且大部分将是兼容的上下文。如果这不起作用,请查看如何使用您正在使用的库创建上下文,在核心配置文件中创建上下文并输入glewExperimental = GL_TRUE;

就像 glut 具有创建具有特定版本和核心配置文件的上下文的功能,您必须具有执行此操作的功能。使用 4.1 版本专门在 Core 配置文件中创建上下文并使用

 glewExperimental = GL_TRUE;
   GLenum err = glewInit();
   if(err != GLEW_OK){
   printf("ERROR: GLEW failed to initialize.\n");
   exit(1);
} 

否则只需删除对glewExperimental = GL_TRUE; 的调用并查看

【讨论】:

  • 我认为我的错误是我如何创建 RenderWindow。我只是设置它,以便在 main() 中创建窗口并将其传递给渲染函数以显示它,它在那里工作正常。
  • 对不起,我没明白你在说什么
【解决方案2】:

我怀疑 create 方法只创建窗口类,而不是创建/显示窗口。这可能是问题所在。确保在调用 glewInit 之前显示该窗口

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多