Mic*_*son 9 python x11 opengl xlib
我知道可以和GLX一起使用Xlib和OpenGL(我自己在C中完成了).
问题是,我如何在python中执行此操作?该OpenGL模块具有GLX功能[ 文档 ],但它似乎使用C类型,我不知道(也没有,似乎是其他人)如何使用PyOpenGL的xlib类型.
我也试过ctypes直接使用和加载库,但在尝试使用Xlib头文件中定义的C宏时遇到(明显的)问题,比如DefaultRootWindow.
我错过了一些明显的东西,比如PyOpenGL有自己的xlib实现,或者如果没有一些(编译的)模块编写,这是不可能的?
你不能直接在 python-opengl 中使用 python-xlib 类型。但是您可以利用窗口 XID 只是一个数字这一事实在同一窗口上使用 python-opengl。
from Xlib import X, display
from OpenGL import GL, GLX
from OpenGL.raw._GLX import struct__XDisplay
from ctypes import *
# some python-xlib code...
pd = display.Display()
pw = pd.screen().root.create_window(50, 50, 200, 200, 0,
pd.screen().root_depth,
X.InputOutput, X.CopyFromParent)
pw.map()
# ensure that the XID is valid on the server
pd.sync()
# get the window XID
xid = pw.__resource__()
# a separate ctypes Display object for OpenGL.GLX
xlib = cdll.LoadLibrary('libX11.so')
xlib.XOpenDisplay.argtypes = [c_char_p]
xlib.XOpenDisplay.restype = POINTER(struct__XDisplay)
d = xlib.XOpenDisplay("")
# use GLX to create an OpenGL context on the same window XID
elements = c_int()
configs = GLX.glXChooseFBConfig(d, 0, None, byref(elements))
w = GLX.glXCreateWindow(d, configs[0], c_ulong(xid), None)
context = GLX.glXCreateNewContext(d, configs[0], GLX.GLX_RGBA_TYPE, None, True)
GLX.glXMakeContextCurrent(d, w, w, context)
# some python-opengl code....
GL.glShadeModel(GL.GL_FLAT)
GL.glClearColor(0.5, 0.5, 0.5, 1.0)
GL.glViewport(0, 0, 200, 200)
GL.glMatrixMode(GL.GL_PROJECTION)
GL.glLoadIdentity()
GL.glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
GL.glColor3f(1.0, 1.0, 0.0)
GL.glRectf(-0.8, -0.8, 0.8, 0.8)
# assume we got a double buffered fbConfig and show what we drew
GLX.glXSwapBuffers(d, w)
# a terrible end to a terrible piece of code...
raw_input()
Run Code Online (Sandbox Code Playgroud)
虽然这真的很可怕。(为清楚起见,省略了错误检查和选择合理的 fbConfig)
不过,确实应该可以使用 ctypes 进行所有必要的 xlib 调用。例如,Pyglet 以某种方式进行管理,但我不确定您遇到了什么具体问题。