使用SDL创建opengl上下文时出错(BadMatch)

时间:2017-02-02 23:01:12

标签: c++ opengl

此代码正常运行,但在重构后停止工作,并且仅在一台计算机上使用NVidia显卡停止工作。

我已将其缩小到这个范围:

此代码有效:

SDL_GL_SetAttribute ( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
SDL_GL_SetAttribute ( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SetAttribute ( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_ALPHA_SIZE, 8 );

SDL_Window *NewSDLWindowHandle = SDL_CreateWindow ( "SDL invisible window", 0, 0, 100, 100, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN );
if ( NewSDLWindowHandle == NULL )
    {
    LOG_ERROR ( "Unable to create SDL window. \"%s\"", SDL_GetError() );
    return false;
    }

ContextHandle = SDL_GL_CreateContext ( NewSDLWindowHandle );
if ( ContextHandle == NULL )
    {
    LOG_ERROR ( "Unable to create opengl context. \"%s\"", SDL_GetError() );
    SDL_DestroyWindow ( NewSDLWindowHandle );
    ContextHandle = NULL;
    return false;
    }

if ( SDL_GL_MakeCurrent ( NewSDLWindowHandle, ContextHandle ) != 0 )
    {
    LOG_ERROR ( "Unable to activate opengl context. \"%s\"", SDL_GetError() );
    SDL_DestroyWindow ( NewSDLWindowHandle );
    ContextHandle = NULL;
    return false;
    }


#ifdef GRAPHICS_BACKEND_USE_GLEW
#ifdef __APPLE__
glewExperimental = GL_TRUE;
#endif
glewInit();
#endif
NewSDLWindowHandle = SDL_CreateWindow ( "SDL opengl window window", 0, 0, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
if ( NewSDLWindowHandle == NULL )
    {
    LOG_ERROR ( "Unable to create SDL window. \"%s\"", SDL_GetError() );
    return false;
    }

基本上我创建了一个不可见的窗口,只是为了初始化一个opengl上下文,获取版本,检查扩展等等......然后我创建了我将要使用的实际窗口。 现在这个新版本出于某种原因不起作用:

SDL_Window *NewSDLWindowHandle = SDL_CreateWindow ( "SDL opengl window window", 0, 0, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
if ( NewSDLWindowHandle == NULL )
    {
    LOG_ERROR ( "Unable to create SDL window. \"%s\"", SDL_GetError() );
    return NULL;
    }

SDL_GL_SetAttribute ( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
SDL_GL_SetAttribute ( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SetAttribute ( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute ( SDL_GL_ALPHA_SIZE, 8 );

/*    SDL_Window *NewSDLWindowHandle = SDL_CreateWindow ( "SDL invisible window", 0, 0, 100, 100, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN );
if ( NewSDLWindowHandle == NULL )
    {
    LOG_ERROR ( "Unable to create SDL window. \"%s\"", SDL_GetError() );
    return false;
    }*/

ContextHandle = SDL_GL_CreateContext ( NewSDLWindowHandle );
if ( ContextHandle == NULL )
    {
    LOG_ERROR ( "Unable to create opengl context. \"%s\"", SDL_GetError() );
    SDL_DestroyWindow ( NewSDLWindowHandle );
    ContextHandle = NULL;
    return false;
    }

if ( SDL_GL_MakeCurrent ( NewSDLWindowHandle, ContextHandle ) != 0 )
    {
    LOG_ERROR ( "Unable to activate opengl context. \"%s\"", SDL_GetError() );
    SDL_DestroyWindow ( NewSDLWindowHandle );
    ContextHandle = NULL;
    return false;
    }

你可以看到我基本上所做的一切都不是创建不可见的窗口,只是创建所需的窗口,然后创建一个opengl上下文。 它在SDL_GL_CreateContext后检查失败,并且#34;无法使GL上下文变为当前:BadMatch(无效的参数属性)"

所以,在最终版本中(也可以),我只是将SDL_GL_SetAttribute cals移动到SDL_CreateWindow之前,并创建了窗口并且它可以工作。任何人都可以向我解释原因吗?为什么我在创建一个仍未与OpenGL关联的窗口之前或之后创建的上下文设置opengl属性是否重要?

0 个答案:

没有答案