首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL2和GLEW,如果使用SDL_GL_SetAttribute(),则无法获得正确的SDL_GL_SetAttribute版本

SDL2和GLEW,如果使用SDL_GL_SetAttribute(),则无法获得正确的SDL_GL_SetAttribute版本
EN

Stack Overflow用户
提问于 2014-03-16 10:09:41
回答 1查看 8.3K关注 0票数 1

我使用SDL2进行操作系统接口,使用GLEW加载OpenGL函数。最初,我的SDL_GL_SetAttribute()调用了-在窗口创建和上下文创建之间。我注意到我的SDL_GL_SetAttribute()调用没有什么效果,所以我重新读取了文献资料,它声明“在创建OpenGL窗口之前,应该将请求的属性设置为”。如果我尝试这样做,我只能获得一个OpenGL 1.1上下文(微软附带的上下文)。如果我根本不调用SDL_GL_SetAttribute(),就会得到一个没有问题的4.4上下文。

我注意到的一件奇怪的事情是,在创建上下文之后,我对SDL_GL_GetAttribute()的调用似乎返回了不准确的值。如果我不设置设置我得到的任何属性:

代码语言:javascript
复制
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
----------------------------------------------------------------

如果我做,那么设置我得到的所有属性:

代码语言:javascript
复制
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

代码语言:javascript
复制
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(/* ... */);

紧随其后的是格鲁

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22435518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档