调用 glGetString 时出现访问冲突错误
Access violation error when calling glGetString
我正在使用 SDL2 + GLAD 在 C++ 中创建一个 OpenGL 应用程序。在我的主要功能中,我有以下代码:
#include <iostream>
#include <SDL.h>
#include <glad\glad.h>
int main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "SDL could not be initialized.";
return 1;
}
SDL_GL_LoadLibrary(nullptr);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_Window *window = SDL_CreateWindow("Hello world", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 500, 500, SDL_WINDOW_OPENGL);
if (window == nullptr) {
std::cout << "SDL could not open window";
return 1;
}
const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) {
std::cout << "SDL could not create context";
return 1;
}
printf("OpenGL loaded\n");
printf("Vendor: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version OpenGL: %s\n", glGetString(GL_VERSION));
printf("Version GLSL: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
int w, h;
SDL_GetWindowSize(window, &w, &h);
glViewport(0, 0, w, h);
glClearColor(0.0f, 0.5f, 1.0f, 0.0f);
SDL_Event event;
bool quit = false;
while (!quit) {
SDL_GL_SwapWindow(window);
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
}
return 0;
}
但是,当我 运行 这样做时,我收到以下错误:
Exception thrown at 0x0000000000000000 in TestApp.exe: 0xC0000005: Access violation executing location 0x0000000000000000.
打印了 OpenGL loaded
消息,Visual Sutio 显示在 printf("Vendor:%s\n", glGetString(GL_VENDOR));
行抛出错误。
我已确保 link SDL2 和 GLAD 在解决方案的属性 window 中正确。什么可能导致此错误?
如果产生错误,glGetString
returns 0。
然后 printf
尝试访问地址 0 处的内存。
或者 glGetString
不可用,因为未加载 OpenGL 库。
所以您可能在初始化 OpenGL 时遇到了一些问题。
尝试在 SDL_GL_LoadLibrary
中指定 OpenGL DLL 模块的完整路径
请确保SDL_GL_LoadLibrary
为return 0,否则请致电SDL_GetError()
获取更多信息。
Glad Loader-Generator has to be initialized by either gladLoadGL
or gladLoadGLLoader
, right after creating and making current the OpenGL context by SDL_GL_CreateContext
.
另见 OpenGL Loading Library - glad
例如:
const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) {
std::cout << "SDL could not create context";
return 1;
}
if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
{
std::cout << "Failed to initialize OpenGL context" << std::endl;
return -1;
}
printf("OpenGL loaded\n");
printf("Vendor: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version OpenGL: %s\n", glGetString(GL_VERSION));
printf("Version GLSL: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
我正在使用 SDL2 + GLAD 在 C++ 中创建一个 OpenGL 应用程序。在我的主要功能中,我有以下代码:
#include <iostream>
#include <SDL.h>
#include <glad\glad.h>
int main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "SDL could not be initialized.";
return 1;
}
SDL_GL_LoadLibrary(nullptr);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_Window *window = SDL_CreateWindow("Hello world", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 500, 500, SDL_WINDOW_OPENGL);
if (window == nullptr) {
std::cout << "SDL could not open window";
return 1;
}
const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) {
std::cout << "SDL could not create context";
return 1;
}
printf("OpenGL loaded\n");
printf("Vendor: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version OpenGL: %s\n", glGetString(GL_VERSION));
printf("Version GLSL: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
int w, h;
SDL_GetWindowSize(window, &w, &h);
glViewport(0, 0, w, h);
glClearColor(0.0f, 0.5f, 1.0f, 0.0f);
SDL_Event event;
bool quit = false;
while (!quit) {
SDL_GL_SwapWindow(window);
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
}
return 0;
}
但是,当我 运行 这样做时,我收到以下错误:
Exception thrown at 0x0000000000000000 in TestApp.exe: 0xC0000005: Access violation executing location 0x0000000000000000.
打印了 OpenGL loaded
消息,Visual Sutio 显示在 printf("Vendor:%s\n", glGetString(GL_VENDOR));
行抛出错误。
我已确保 link SDL2 和 GLAD 在解决方案的属性 window 中正确。什么可能导致此错误?
如果产生错误,glGetString
returns 0。
然后 printf
尝试访问地址 0 处的内存。
或者 glGetString
不可用,因为未加载 OpenGL 库。
所以您可能在初始化 OpenGL 时遇到了一些问题。
尝试在 SDL_GL_LoadLibrary
请确保SDL_GL_LoadLibrary
为return 0,否则请致电SDL_GetError()
获取更多信息。
Glad Loader-Generator has to be initialized by either gladLoadGL
or gladLoadGLLoader
, right after creating and making current the OpenGL context by SDL_GL_CreateContext
.
另见 OpenGL Loading Library - glad
例如:
const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) {
std::cout << "SDL could not create context";
return 1;
}
if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
{
std::cout << "Failed to initialize OpenGL context" << std::endl;
return -1;
}
printf("OpenGL loaded\n");
printf("Vendor: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version OpenGL: %s\n", glGetString(GL_VERSION));
printf("Version GLSL: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));