python - 找不到匹配的 GLX 视觉对象
问题描述
我正在努力使用pygame
和初始化 OpenGL 显示pyopengl
。
import pygame
pygame.init()
pygame.display.set_mode((1920, 1080), pygame.OPENGL)
给出错误:
pygame.error:找不到匹配的 GLX 视觉对象
如果我没有指定pygame.OPENGL
,我会得到一个正确初始化的显示和一个 pygame 窗口。
- 我正在使用 python 3 (
Python 3.6.2 :: Anaconda custom (64-bit)
) - 我在 Manjaro Linux 上,正在运行
i3
Windows 管理器 - 我使用的是戴尔 XPS 笔记本电脑,它同时具有 Intel 和 Nvidia 图形适配器,并且我正在使用
optirun
Nvidia 硬件,但无论我使用哪种图形适配器,我都能获得相同的效果 glxgears
并且optirun glxgears
两者都工作正常,所以我相信 OpenGL 在机器上可用并且工作正常optirun glxinfo
https://pastebin.com/v6VjZgBZ
为了找到一组合适的显示参数,我运行了:
import pygame
from pygame.locals import *
pygame.init()
print(pygame.display.Info())
print(pygame.display.list_modes(32, pygame.FULLSCREEN))
print(pygame.display.mode_ok((1920, 1080)))
print(pygame.display.mode_ok((1920, 1080), pygame.OPENGL))
这给出了以下输出:
VideoInfo(hw = 0, wm = 1,video_mem = 0
blit_hw = 0, blit_hw_CC = 0, blit_hw_A = 0,
blit_sw = 0, blit_sw_CC = 0, blit_sw_A = 0,
bitsize = 32, bytesize = 4,
masks = (16711680, 65280, 255, 0),
shifts = (16, 8, 0, 0),
losses = (0, 0, 0, 8),
current_w = 3200, current_h = 1800
[(3200, 1800), (2880, 1620), (2560, 1600), (2560, 1440), (2048, 1536), (2048, 1152), (1920, 1440), (1920, 1200), (1920, 1080), (1856, 1392), (1792, 1344), (1680, 1050), (1600, 1200), (1600, 900), (1400, 1050), (1400, 900), (1368, 768), (1280, 1024), (1280, 960), (1280, 800), (1280, 720), (1024, 768), (1024, 576), (960, 540), (864, 486), (800, 600), (720, 405), (640, 480), (640, 360)]
32
32
下面是 Nvidia 适配器的摘录optirun glxinfo
,glxinfo
显示了几个 GLX 视觉效果(完整输出https://pastebin.com/v6VjZgBZ):
70 GLX Visuals
visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav
id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat
----------------------------------------------------------------------------
0x020 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x021 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0ce 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0cf 24 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0d0 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0d1 24 tc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0d2 24 tc 0 24 0 r . . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0d3 24 tc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0d4 24 tc 0 24 0 r . . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0d5 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0d6 24 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0d7 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0d8 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0d9 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0da 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x0db 24 tc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0dc 24 tc 0 24 0 r y . 8 8 8 0 . . 0 24 8 16 16 16 0 0 0 None
0x0dd 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0de 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x0df 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0e0 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0e1 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0e2 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0e3 24 tc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0e4 24 tc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0e5 24 tc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0e6 24 tc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0e7 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0e8 24 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0e9 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0ea 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0eb 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0ec 24 dc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0ed 24 dc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0ee 24 dc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0ef 24 dc 0 24 0 r . . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x0f0 24 dc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0f1 24 dc 0 24 0 r . . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0f2 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0f3 24 dc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0f4 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0f5 24 dc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0f6 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0f7 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x0f8 24 dc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x0f9 24 dc 0 24 0 r y . 8 8 8 0 . . 0 24 8 16 16 16 0 0 0 None
0x0fa 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0fb 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x0fc 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0fd 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x0fe 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x0ff 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x100 24 dc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x101 24 dc 0 24 0 r y . 8 8 8 0 . . 0 0 0 0 0 0 0 0 0 None
0x102 24 dc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x103 24 dc 0 24 0 r y . 8 8 8 0 . . 0 24 8 0 0 0 0 0 0 None
0x104 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x105 24 dc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x106 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x107 24 dc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x06f 32 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x108 32 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x109 32 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x10a 32 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x10b 32 tc 0 32 0 r y . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x10c 32 tc 0 32 0 r . . 8 8 8 8 . . 0 0 0 0 0 0 0 0 0 None
0x10d 32 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x10e 32 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x10f 32 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
0x110 32 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
请帮助我诊断问题并让启用 OpenGL 的 pygame 窗口运行。
更新 20190131
我尝试按照@hidefromkgbipython
的建议在(python 3.6.2)中设置 24 位颜色模式,但我遇到了同样的问题(我之前尝试过):
In [1]: import pygame
In [2]: pygame.init()
Out[2]: (6, 0)
In [3]: pygame.display.set_mode((1920, 1080), pygame.OPENGL, 24)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-3-b9c85baaf5fe> in <module>()
----> 1 pygame.display.set_mode((1920, 1080), pygame.OPENGL, 24)
error: Couldn't find matching GLX visual
我能够使用 GLUT 从 c++ 中毫无问题地运行 OpenGL。
更新#2 20190131
我现在有两个带有 strace 输出的最小程序(python
, )(请参阅https://paste.ee/p/ah1nq)。c++
此python
程序因GLX Visuals错误而失败:
import pygame
pygame.init()
pygame.display.set_mode((1920, 1080), pygame.OPENGL)
该c++
程序成功创建了一个窗口:
#include <GL/glut.h>
void display(void) {
}
int
main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("window initialisation test");
return 0;
}
该c++
程序是用g++ test.cpp -lGL -lglut -o test
.
我查看了strace
输出,但无法确定它的正面或反面。
更新#3 20190131
我运行ltrace
了上述两个程序并得到了
python
$ ltrace python test.py
__libc_start_main(0x400ab0, 2, 0x7ffe171cfb58, 0x400cc0 <unfinished ...>
_PyMem_SetupAllocators(0x400da8, 0x7ffe171cfb58, 0x7ffe171cfb70, 0x7f82b2fd4578) = 0
PyMem_RawMalloc(24, 0x400daf, 0x7ffe171cfb70, 6) = 0xf8d260
PyMem_RawMalloc(24, 0xf8d270, 0xf8d260, 0xf8d260) = 0xf8d280
setlocale(LC_ALL, nil) = "C"
_PyMem_RawStrdup(0x7f82b2f9c007, 0, 0, 0xf8d280) = 0xf8d2a0
setlocale(LC_ALL, "") = "LC_CTYPE=en_AU.utf8;LC_NUMERIC=e"...
Py_DecodeLocale(0x7ffe171d1310, 0, 0, 0) = 0xf90710
Py_DecodeLocale(0x7ffe171d1317, 0, 0xf90728, 0) = 0xf90740
setlocale(LC_ALL, "C") = "C"
PyMem_RawFree(0xf8d2a0, 16, 0, 0) = 0
Py_Main(2, 0xf8d260, 0, 0xf8e260Traceback (most recent call last):
File "test.py", line 4, in <module>
pygame.display.set_mode((1920, 1080), pygame.OPENGL)
pygame.error: Couldn't find matching GLX visual
) = 1
_PyMem_SetupAllocators(0x400da8, 0x7f82b2fd6710, 0, 2880) = 0
PyMem_RawFree(0xf90710, 0x400daf, 0, 6) = 0
PyMem_RawFree(0xf90740, 0xf90760, 0, 0xf90760) = 0
PyMem_RawFree(0xf8d260, 0xf90700, 0, 0xf90700) = 0
PyMem_RawFree(0xf8d280, 0xf8f310, 0, 0xf8f310) = 0
+++ exited (status 1) +++
c++
$ ltrace ./test
glutInit(0x7ffd507caccc, 0x7ffd507cadb8, 0x7ffd507cadb8, 128) = 0
glutInitDisplayMode(18, 1, 0x7fb32b5c44e0, 32) = 0x7fb32b7d70e0
glutCreateWindow(0x562359efe004, 1, 0x7fb32b5c44e0, 32) = 1
--- SIGWINCH (Window changed) ---
+++ exited (status 0) +++
更新#4 20190213
感谢您的输入,@hidefromkgb。
我尝试使用pygame.OPENGL | pygame.DOUBLEBUF
并且也只是通过18
,但得到了相同的结果。
import pygame
from pygame.locals import *
pygame.init()
pygame.display.set_mode((1920, 1080), pygame.OPENGL | pygame.DOUBLEBUF)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-11-59807ce30659> in <module>()
3
4 pygame.init()
----> 5 pygame.display.set_mode((1920, 1080), pygame.OPENGL | pygame.DOUBLEBUF)
error: Couldn't find matching GLX visual
print(pygame.OPENGL)
print(pygame.DOUBLEBUF)
2
1073741824
解决方案
抱歉,回复晚了,之前没有看到您的编辑。以后如果需要引起别人的注意,请在评论中用昵称称呼别人。
ltrace
似乎让问题更清楚了。第一个参数glutInitDisplayMode
等于 18,这意味着GLUT_DOUBLE | GLUT_DEPTH
,对于GLUT_DOUBLE
= 2,GLUT_DEPTH
= 16。
反过来,pygame.display.set_mode
调用在 GL 初始化期间缺少这两个标志。
尝试使用pygame.OPENGL | pygame.DOUBLEBUF
而不仅仅是pygame.OPENGL
.
推荐阅读
- flutter - 如何从列表中的列表数据创建列表视图?
- web-scraping - 抓取旧版本的 Playstore 应用程序
- javascript - 自动为 JS 事件添加被动监听器
- python - Pyomo DataPortal 不使用多个索引(抽象模型,CSV 导入)
- react-native - 如何重置嵌套的堆栈导航导航器 react-navigation v5
- keycloak - Keycloak 在客户端级别为 IDP 设置范围
- java - 彭博未发布 QuickFixJ 的价格
- flutter - Flutter 无法添加抽屉
- uicollectionviewlayout - 使用带有 NSDiffableDataSource 的自定义 CollectionView 布局
- laravel - Laravel 8 - 查找图片网址