此代码正常运行,但在重构后停止工作,并且仅在一台计算机上使用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属性是否重要?