【发布时间】:2021-06-27 13:17:18
【问题描述】:
这很好用:
int main(int argc, char** argv)
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCR_WIDTH, SCR_HEIGHT, SDL_WINDOW_OPENGL);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GLContext mainContext = SDL_GL_CreateContext(window);
gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);
SDL_Event event;
int running = 1;
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
...
return 0;
}
但是,如果我将初始化封装到一个类中,我会在调用 glCreateShader 时遇到访问冲突,即使在初始化 SDL 和 OpenGL 时我没有收到任何错误消息:
int main(int argc, char** argv)
{
WindowManager wm;
if (!wm.Construct())
return 0;
SDL_Event event;
int running = 1;
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); //<---- access violation here
...
return 0;
}
这是我的 WindowManager 类以及相关功能:
class WindowManager
{
public:
WindowManager() = default;
bool Construct()
{
if (SDL_Init(SDL_INIT_VIDEO) < 0);
return false;
mWindow = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width,
height, SDL_WINDOW_OPENGL);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
mContext = SDL_GL_CreateContext(mWindow);
if (!mWindow)
{
spdlog::error("WindowManager could not be created!");
return false;
}
if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
{
spdlog::error("Failed to initialize GLAD!");
return false;
}
return true;
}
SDL_Window* mWindow;
SDL_GLContext mContext;
};
如果有人能阐明问题所在,我将不胜感激!
【问题讨论】:
-
我注意到您没有检查原始版本
(!mWindow)和(!gladLoadGLLoader ...)中的错误,但您现在正在检查。会不会一直有错误代码(甚至可能是错误的错误代码),但现在你实际上是因为它而退出? -
仅此更改看起来一点问题都没有,可能您的问题出在我们看不到的代码的其他部分。考虑制作最小的完整可编译示例(并确保您的问题实际上在此示例中重现,至少在您的机器上)。
标签: c++ opengl sdl-2 access-violation