运行Python OpenGL演示程序时GLX请求失败问题求助
我先梳理下你的问题:你运行这段Python OpenGL演示代码时程序崩溃,抛出了GLX相关的BadRequest错误,而glxgears能正常运行,但glxinfo显示direct rendering: No,即使设置了LIBGL_DEBUG=verbose也没得到更多线索。下面是针对性的解决思路:
你的测试代码:
import pg class Window(pg.Window): def setup(self): self.wasd = pg.WASD(self) self.wasd.look_at((0, 0, 2), (0, 0, 0)) self.program = pg.DirectionalLightProgram() self.context = pg.Context(self.program) sphere = pg.Sphere(3, 0.5, (0, 0, 0)) self.context.position = pg.VertexBuffer(sphere.positions) self.context.normal = pg.VertexBuffer(sphere.normals) def update(self, t, dt): matrix = self.wasd.get_matrix() matrix = matrix.perspective(65, self.aspect, 0.1, 100) self.context.matrix = matrix self.context.camera_position = self.wasd.position def draw(self): self.clear() self.context.draw(pg.GL_TRIANGLES) if __name__ == "__main__": pg.run(Window)
报错信息:
X Error of failed request: BadRequest (invalid request code or no such operation)
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 168 ()
Serial number of failed request: 114
Current serial number in output stream: 114
核心排查方向:direct rendering禁用的影响
虽然glxgears能跑,但它对直接渲染的依赖很低,而你用的pg库(推测是pyglet或类似的OpenGL封装库)可能需要直接渲染才能启用某些高级特性(比如顶点缓冲、光照着色器),所以先解决direct rendering的问题:
1. 检查GPU设备权限
运行以下命令查看显卡设备的权限:
ls -l /dev/dri/
看renderD*(比如renderD128)的所属组是不是video,然后用groups命令确认你的用户是否在video组里。如果不在,执行:
sudo usermod -aG video $USER
然后重新登录系统,再运行glxinfo看direct rendering是否变为Yes。
2. 验证显卡驱动是否正常工作
- 如果是NVIDIA显卡:
检查nvidia-drm模块是否加载:lsmod | grep nvidia_drm,如果没加载,尝试sudo modprobe nvidia_drm;同时确认你用的是官方闭源驱动(不是nouveau开源驱动),可以用nvidia-smi查看驱动状态。 - 如果是AMD/Intel显卡:
确保Mesa驱动是最新版本,比如Ubuntu系统可以运行sudo apt update && sudo apt upgrade mesa-utils,然后重启系统。
3. 排查Xorg驱动加载问题
查看Xorg日志里的错误信息:
cat /var/log/Xorg.0.log | grep "(EE)"
搜索有没有驱动加载失败的提示,比如Failed to load module "nvidia"这类信息,根据提示修复驱动配置。
针对GLX opcode 168错误的额外排查
这个错误对应GLX的某个扩展操作失败,可能是OpenGL版本或扩展支持不足:
- 查看当前支持的OpenGL版本:
glxinfo | grep "OpenGL version"
如果版本低于3.3,你的DirectionalLightProgram可能需要更高版本的OpenGL支持,这时候必须更新显卡驱动来获得更高版本支持。
2. 临时测试间接渲染:
设置环境变量后再运行程序,看是否能正常启动:
LIBGL_ALWAYS_INDIRECT=1 python your_script.py
如果能运行,说明问题确实出在直接渲染;如果还是崩溃,那可能是pg库的兼容性问题。
库兼容性检查
- 确认
pg库的版本,尝试更新到最新版:
如果是pyglet(很多人会把pyglet导入为pg),运行:
pip install --upgrade pyglet
- 简化测试代码:
先写一个最基础的窗口程序,排除复杂功能的干扰:
import pg class Window(pg.Window): def draw(self): self.clear() if __name__ == "__main__": pg.run(Window)
如果这个基础程序能运行,说明问题出在光照程序、模型加载或相机控制的部分,再逐步添加代码排查。
虚拟机环境特殊处理
如果你是在虚拟机里运行,必须开启GPU 3D加速功能:
- VirtualBox:设置 -> 显示 -> 启用3D加速,同时分配足够的显存。
- VMware:虚拟机设置 -> 显示器 -> 加速3D图形。
内容的提问来源于stack exchange,提问作者MeadowMuffins

