2013-02-18 34 views
9

私はGLX(私はCでそれを自分自身をやった)と、一緒のXlibとOpenGLを使用することが可能であることを知っています。xlibとOpenGLモジュールをpythonと一緒に使うにはどうすればいいですか?

問題がある

、どのように私はPythonでこれを行うのですか? OpenGLモジュールは、[documentation] GLX機能を持っていますが、PyOpenGLでxlib typesを使用する方法、Cタイプを使用しているように見えると私は(誰を行い表示されず、)見当がつかない。

また、DefaultRootWindowのように、Xlibヘッダーファイルで定義されたCマクロを使用しようとすると、ライブラリが直接ロードされていましたが、(明らかな)問題が発生しました。

独自のxlib実装を持つPyOpenGLのような明白なものがありませんか、これはモジュールコンパイルなしでは不可能ですか?

+0

あなたは、このようなXlibのような低レベルのライブラリを使用するための完全に正当な理由があるかもしれませんが、私は聞いている:あなたは、このような[QtOpenGL](http://srinikom.github.com/pysideとして非常に高いレベルのものを使用して検討しています-docs/PySide/QtOpenGL/index.html)をPySideからダウンロードしますか? PySideを使って書くコードは、Xlibを使って書くものとは異なり、複数のプラットフォーム(Windows、Linux、Mac)でも動作します。ちょっとした考え。 – crayzeewulf

+0

いいえ、PyOpenGLには独自のxlib実装はありません。 Python側には実際には何もありません。 Python-xlibは2009年頃に最後にリリースされたので、事実上死にました。 GLUTまたはより高度なレベルのツールキットを使用してください。 –

+1

@crayzeewulf:うん、いい理由がある。私はデスクトップにインタラクティブなOpenGLの壁紙を描くことを含むX-windowsのハッキングをしています。それはEMWHのヒントと他のいくつかの乱雑なビットを設定することが関係しているので、Qtやそれが何でもできることは間違いありません。 –

答えて

2

あなたの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() 

これは本当に恐ろしいです。 (エラー賢明fbConfigを明確にするために省略チェックすると選択)

本当に必要なすべてのXlibの操作を行うことが可能であるべきであるとはいえctypesのを呼び出します。たとえば、Pygletは何とかしていますが、どのような問題に遭遇したのかよく分かりません。

+0

"これは本当に恐ろしいことです" - 合意しましたが、これは私が求めていたものなのでこれに報酬を与えます。 :)私が実際にやったことは、通常のC++ユーティリティを作り、それをBoost :: Pythonでラップして、必要なビットだけを公開することでした。乾杯! –

関連する問題