如何解决访问冲突执行位置 0x0000000000000000带有 GLAD 和 GLFW 的 OpenGL
我一直在尝试按照 learnopengl.com 和 glfw.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
解决方法
为什么会出现此错误?
因为 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 举报,一经查实,本站将立刻删除。