微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问冲突执行位置 0x0000000000000000带有 GLAD 和 GLFW 的 OpenGL

如何解决访问冲突执行位置 0x0000000000000000带有 GLAD 和 GLFW 的 OpenGL

我一直在尝试按照 learnopengl.comglfw.org 中的说明使用 GLAD 和 GLFW 创建 OpenGL 窗口。乍一看,根据文档,这足以使窗口正常工作:

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

using namespace std;

// framebuffer size callback function
void resize(GLFWwindow* window,int width,int height)
{
    glViewport(0,width,height);
}

void render(GLFWwindow* window) {

    // here we put our rendering code
    
}

void main() {

    int width = 800;
    int height = 600;

    // We initialzie GLFW
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MInor,3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);

    // Now that it is initialized,we create a window
    GLFWwindow* window = glfwCreateWindow(width,height,"My Title",NULL,NULL);

    // We can set a function to recieve framebuffer size callbacks,but it is optional
    glfwSetFramebufferSizeCallback(window,resize);


    //here we run our window,swapping buffers and all.
    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glClearColor(0.0f,0.0f,0.1f,0.0f);
        render(window);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

}

假设您的 Visual Studio 环境配置正确,这应该可以正常运行。但是,如果我们运行项目,就会出现这个错误

Exception thrown at 0x0000000000000000 in CPP_Test.exe: 0xC0000005: Access violation executing location

我们在运行程序之前没有出现任何错误,为什么会出现这个错误

解决方法

为什么会出现此错误?

来自learnopengl.com

因为 OpenGL 只是一个真正的标准/规范,驱动程序制造商将规范实施到特定显卡支持的驱动程序。由于OpenGL驱动有很多不同的版本,其大部分函数的位置在编译时是未知的,需要在运行时查询。然后开发人员的任务是检索他/她需要的函数的位置并将它们存储在函数指针中以备后用。

GLAD 是一个库,它定义了使用 OpenGL 所需的所有函数,而无需我们自己解决。

例如,当我们调用 GLAD 函数 glClear 时,我们实际上是从 gl 上下文中调用名为 glad_glClear 的函数。进行此调用时,GLAD 会查找当前的 gl 上下文,以影响正确的窗口,就像说话一样。出现此问题的原因是 GLAD 将始终使用上下文,即使它没有找到。

发生这种情况时,会在内存中的此位置 (0x0000000000000000) 进行调用,并且由于它不是 GL 上下文,因此会引发 Access violation 异常。


我该如何解决?

解决这个问题很简单。如果您正在阅读本文,您可能正在使用 GLAD 和 GLFW。 GLFW 有一个函数,它允许我们在创建窗口后只需一次调用即可定义上下文:

glfwMakeContextCurrent(GLFWwindow* window);

太好了,现在我们已经设置了上下文,但 GLAD 还不知道。为此,我们只需在设置上下文后立即使用 gladLoadGL 初始化 GLAD。

我们现在可以再次运行我们的程序,一切都应该正常了。

这是经过这个小改动的完整代码:

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

using namespace std;

// framebuffer size callback function
void resize(GLFWwindow* window,int width,int height)
{
    glViewport(0,width,height);
}

void render(GLFWwindow* window) {

    // here we put our rendering code
    
}

void main() {

    int width = 800;
    int height = 600;

    // We initialzie GLFW
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);

    // Now that it is initialized,we create a window
    GLFWwindow* window = glfwCreateWindow(width,height,"My Title",NULL,NULL);

    // We set the context to be our window and then initialize GLAD
    glfwMakeContextCurrent(window);
    gladLoadGL();   

    // We can set a function to recieve framebuffer size callbacks,but it is optional
    glfwSetFramebufferSizeCallback(window,resize);


    //here we run our window,swapping buffers and all.
    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glClearColor(0.0f,0.0f,0.1f,0.0f);
        render(window);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
}

我自己花了几个小时才找到这个解决方案,因为每个人都在初始化 GLEW 时解决了它,但它没有包含在这个项目中,所以这对我不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。