如何解决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
如果
所以,问题很简单。我不知道如何解决它。它本质上的意思是,找不到对应于我在 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 举报,一经查实,本站将立刻删除。