【问题标题】:SDL2 + OpenGL access violationSDL2 + OpenGL 访问冲突
【发布时间】: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


【解决方案1】:

由于我将 WindowManager 编译为 dll 并在单独的项目中使用它,因此我基本上制作了两个程序。

程序 A 有一个初始化的 OpenGL 上下文,但使用 WindowManager 的程序 B 没有。

所以我必须编写一个函数来将 glProcAddress 公开给程序 B,以便进行原始 OpenGL 调用,例如 glCreateShader()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多