我使用SDL2进行操作系统接口,使用GLEW加载OpenGL函数。最初,我的SDL_GL_SetAttribute()调用了-在窗口创建和上下文创建之间。我注意到我的SDL_GL_SetAttribute()调用没有什么效果,所以我重新读取了文献资料,它声明“在创建OpenGL窗口之前,应该将请求的属性设置为”。如果我尝试这样做,我只能获得一个OpenGL 1.1上下文(微软附带的上下文)。如果我根本不调用SDL_GL_SetAttribute(),就会得到一个没有问题的4.4上下文。
我注意到的一件奇怪的事情是,在创建上下文之后,我对SDL_GL_GetAttribute()的调用似乎返回了不准确的值。如果我不设置设置我得到的任何属性:
SDL GL Context Major Version: 2
SDL GL Context Minor Version: 1
SDL GL Context Profile: Unknown
SDL GL Accelerated Visuals: True
SDL GL Double Buffering: True
SDL GL Depth Size: 24
----------------------------------------------------------------
Graphics Successfully Initialized
OpenGL Info
Version: 4.4.0
Vendor: NVIDIA Corporation
Renderer: GeForce GT 650M/PCIe/SSE2
Shading: 4.40 NVIDIA via Cg compiler
----------------------------------------------------------------如果我做,那么设置我得到的所有属性:
SDL GL Context Major Version: 3
SDL GL Context Minor Version: 1
SDL GL Context Profile: Compatibility
SDL GL Accelerated Visuals: True
SDL GL Double Buffering: True
SDL GL Depth Size: 32
----------------------------------------------------------------
Graphics Successfully Initialized
OpenGL Info
Version: 1.1.0
Vendor: Microsoft Corporation
Renderer: GDI Generic
Shading: (null)
----------------------------------------------------------------注意,在第一种情况下,SDL说我有一个2.1上下文,而实际上我得到了一个4.4。在第二种情况下,它说我有一个3.1上下文(我所要求的),而实际上我有一个1.1。
我的当前设置代码(遵循本教程中概述的内容)。省略错误检查以保证简洁性。
SDL
SDL_Init(SDL_INIT_VIDEO);
// Request compatibility because GLEW doesn't play well with core contexts.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
SDL_Window * window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, context)
// Print what the OS actually gave us for each value we requested.
SDL_GL_GetAttribute(/* ... */);紧随其后的是格鲁
glewExperimental = GL_TRUE;
GLenum result = glewInit();
if(result != GLEW_OK)
{
// Handle & print error
}
if(GLEW_VERSION_1_1)
{
printf("----------------------------------------------------------------\n");
printf("Graphics Successfully Initialized\n");
printf("OpenGL Info\n");
printf(" Version: %s\n", glGetString(GL_VERSION));
printf(" Vendor: %s\n", glGetString(GL_VENDOR));
printf(" Renderer: %s\n", glGetString(GL_RENDERER));
printf(" Shading: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
printf("----------------------------------------------------------------\n");
}
else
{
printf("Unable to get any OpenGL version from GLEW!");
}
if(!GLEW_VERSION_3_1)
{
// Handle & print error
}发布于 2014-03-16 19:46:21
首先,要完全清楚的是,GL3.1在技术上确实有兼容性的概念,其形式是一个名为GL_ARB_compatibility的扩展。如果扩展字符串中存在该扩展,则GL3.0规范中标记为的不推荐的的特性将继续可用。如果不存在,那么GL3.0中的被废弃的实际上是在3.1中删除了。为此,GL3.1规范有一个分叉版本,专门处理这个扩展。
但是,这与上下文配置文件并不是一回事。无法在3.1中主动请求兼容性,只能在事后检测到此行为。因此,正如derhass所指出的,请求3.1“兼容性配置文件”(或任何相关配置文件)上下文是没有意义的。
更重要的是,Microsoft Windows上的默认框架缓冲区并不广泛支持32位深度缓冲区。一些驱动程序允许您选择32位深度缓冲区的像素格式,并且仍然可以获得硬件实现,但更多的情况是,您最终回到了微软基于软件的GDI实现。
这种行为甚至发生在实际支持32位深度缓冲区的GPU上,而处理真正需要32位深度缓冲区的应用程序的最可移植的方法是使用Framebuffer对象。
https://stackoverflow.com/questions/22435518
复制相似问题