微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GLX 上下文创建错误:GLXBadFBConfig

如何解决GLX 上下文创建错误:GLXBadFBConfig

我使用 glXCreateContext 来创建上下文,但该函数已被弃用,并且始终生成 OpenGL 3.0 版,我至少需要 4 个。现在,如果我理解正确,{{1} } 替换了 GLXContext glXCreateContextAttribsARB(display* dpy,GLXFBConfig config,GLXContext share_context,Bool direct,const int* attrib_list);。 “新”函数允许在 glXCreateContext 中明确指定主要版本、次要版本、配置文件等,例如:

attrib_list

然后使用函数

int context_attribs[] =
{
    GLX_CONTEXT_MAJOR_VERSION_ARB,4,GLX_CONTEXT_MInor_VERSION_ARB,5,GLX_CONTEXT_FLAGS_ARB,GLX_CONTEXT_DEBUG_BIT_ARB,GLX_CONTEXT_PROFILE_MASK_ARB,GLX_CONTEXT_COMPABILITY_PROFILE_BIT_ARB,None
};

这就是我在我的程序中所做的。窗口已经创建并且 dpy 是一个指向 display 的有效指针。 glXCreateContextAttribsARB(dpy,config,NULL,true,context_attribs); 我是这样定义的:

config

使用 // GLXFBConfig config; created at the beginning of the program int attrib_list[] = { GLX_RENDER_TYPE,GLX_RGBA_BIT,GLX_RED_SIZE,8,GLX_GREEN_SIZE,GLX_BLUE_SIZE,GLX_DEPTH_SIZE,24,GLX_DOUBLEBUFFER,True,None }; int nAttribs; config = glXChooseFBConfig(dpy,attrib_list,&nAttribs); 检查,我有正确的视觉效果glxinfo 已设置为 vi,我可以与 0x120 确认。它完全满足了上述要求。 到现在为止还挺好。但是在运行应用程序时(编译工作正常),我收到以下错误

glxinfo | grep 0x120

现在,这是错误内容

如果 不支持提供请求的 API 主要和次要版本、向前兼容标志和调试上下文标志的兼容 OpenGL 上下文,则生成 GLXBadFBConfig

所以,问题很简单。我不知道如何解决它。它本质上的意思是,找不到对应于我在 X Error of Failed request: GLXBadFBConfig Major opcode of Failed request: 152 (GLX) Minor opcode of Failed request: 34 () Serial number of Failed request: 31 Current serial number in output stream: 31 中指定的属性attrib_list[] 中的属性的 OpenGL 上下文。使用 context_attribs 我确认我的最高 OpenGL 版本是 4.5。我想听听你对我现在应该做什么的建议。我已经玩了一段时间 glxinfo | grep Max 中的属性,但没有得到任何结果。也许问题真的出在另一个地方。可能我对 GLX 函数的概念总体上有缺陷,如果有请指出!

解决方法

GLX_ARB_create_context 的规范明确了何时可能返回 GLXBadFBConfig 错误:

  * If <config> does not support compatible OpenGL contexts
    providing the requested API major and minor version,forward-compatible flag,and debug context flag,GLXBadFBConfig
    is generated.

这可能令人困惑(因为错误与已创建的 GLXFBConfig 无关),但我就是我们所拥有的。因此,您遇到错误的最明显原因是您的系统实际上不支持 OpenGL 4.5 Compatible Profile 您所请求的 - 但是,它可能支持 OpenGL 4.5 Core Profile 或兼容/较低版本的核心配置文件。对于 Mesa 驱动程序来说,这是一个非常常见的情况,仅支持 OpenGL 3.3+ 核心配置文件,并且仅支持许多 GPU 的 OpenGL 3.0 兼容配置文件(但不是全部 - 有些获得更好的兼容配置文件支持,例如 Radeons)。

如果您还不熟悉OpenGL 配置文件的概念 - 您可以start here

glxinfo 显示有关 Core 和 Compatible 配置文件的信息,可以像这样过滤掉:

glxinfo | grep -e "OpenGL version" -e "Core" -e "Compatible"

它在虚拟 Ubuntu 18.04 上返回给我:

OpenGL core profile version string: 3.3 (Core Profile) Mesa 19.2.8
OpenGL version string: 3.1 Mesa 19.2.8

如果您的应用程序确实需要 OpenGL 4.5 或更高版本,请尝试使用 GLX_CONTEXT_CORE_PROFILE_BIT_ARB 位而不是 GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 位创建上下文,并确保不使用任何已弃用的功能。

请注意,请求特定版本的兼容配置文件通常没有意义 - 只需跳过版本参数即可获得最高支持的版本并从 GL_VERSION/{ 中过滤掉不支持的版本{1}} 个已经创建的上下文,就像在引入配置文件之前几天完成的那样。在核心配置文件的情况下,某些要求支持最高版本的 OpenGL 驱动程序可能会很棘手(例如,没有禁用高于请求的版本的功能) - 以下代码片段可能有用:

GL_MAJOR_VERSION

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。