我是 OpenGL 的新手,我不知道出了什么问题,似乎我不能使用 glDebugMessageCallback 函数,在下一行代码中抛出访问冲突错误,当我将它与“glfw”一起使用时它起作用了但它现在似乎不起作用,提前致谢
ErrorHandler.hpp
#define GLCall(x) x;\
if(isError) __debugbreak();
static bool isError{ false };
namespace ErrorHandler {
void APIENTRY GLDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
}
ErrorHandler.cpp
void APIENTRY ErrorHandler::GLDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
isError = true;
const char* _source;
const char* _type;
const char* _severity;
switch (source) ...
switch (type) ...
switch (severity) ...
if (_severity != "NOTIFICATION") {
fprintf(stderr, "OpenGL error [%d]: %s of %s severity, raised from %s: %s\n",
id, _type, _severity, _source, message);
}
}
Game.cpp
Game::Game(const char* title, uint16_t width, uint16_t height)
{
if (SDL_Init(SDL_INIT_VIDEO) < 0) ...
m_window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
if (!m_window) ...
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
SDL_GL_SetSwapInterval(1);
glewExperimental = GL_TRUE;
if (!glewInit()) ...
m_context = SDL_GL_CreateContext(m_window);
if (!m_context) ...
printf("%s\n", glGetString(GL_VERSION));
#ifdef _DEBUG
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(ErrorHandler::GLDebugMessageCallback, 0);
#endif
m_run();
}
我试过:
1- 将 glDebugMessageCallback 移动到不同的行(在初始化 glew 之后,在创建上下文之后)。
2-我尝试使用另一个函数作为回调。
3- 我试图明确设置 OpenGL 版本 (4.6.0) 和 (4.4.0)。
4-我试图删除任何 sdl 标志(配置文件标志和版本标志)。
一切都给出相同的结果(访问冲突),而它在 GLFW 项目中运行良好