我在pyopengl及其导入方面遇到了一个奇怪的问题,下面是一个很小的测试程序,它从一个更大的程序中切出,但这足以显示问题。您需要安装PyOpenGL,如果按原样运行,它将显示一个空白窗口,如果单击并拖动它,将打印出0。如果取消注释下面的行HANDLE.final = True
,则它将停止工作,请参阅下面的回溯。
from OpenGL.GL import *
from OpenGL.GLUT import *
from ctypes import POINTER
import sys
HANDLE = POINTER(None)
#HANDLE.final = True
def display():
glutSwapBuffers()
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400,400)
glutCreateWindow("GLUT Window")
glutDisplayFunc(display)
def readPx(x,y):
data_all = glReadPixels(x, y, 1, 1, GL_RGB, GL_BYTE)
print data_all
glutMotionFunc(readPx)
glutMainLoop()
在未注释该行的情况下执行以下操作:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\OpenGL\GLUT\special.py", line 130, in safeCall
return function( *args, **named )
File "C:\Users\Robin\dev\ogl_bug\ogl_bug.py", line 19, in readPx
data_all = glReadPixels(x, y, 1, 1, GL_RGB, GL_BYTE)
File "C:\Python27\lib\site-packages\OpenGL\GL\images.py", line 371, in glReadPixels
imageData
File "C:\Python27\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__
return self( *args, **named )
ArgumentError: argument 7: <type 'exceptions.TypeError'>: wrong type
GLUT Motion callback <function readPx at 0x02CC5830> with (238, 190),{} failed: returning None argument 7: <type 'exceptions.TypeError'>: wrong type
在我较大的程序中,尝试导入OpenGL.raw.WGL._types(由任何WGL Opengl扩展名导入)时,此HANDLE代码被深埋了5或6个导入,但这是仍会导致错误的最小片段。
我不明白为什么这一行会影响似乎无关的gl调用-如何在不破坏PyOpenGL其他部分的情况下使用此扩展加载?
答案 0 :(得分:1)
我找到了原因-POINTER(None)
退回ctypes.c_void_p
,这是一个单例,这意味着.final
属性在此导入后可见,很可能稍后会破坏某种类型检查机制。
它在PyopenGL的github版本中已修复。这是提交:
https://github.com/mcfletch/pyopengl/commit/f087200406a37fc4b99eaad701d18bc64ded2d71
您可以通过在任何OpenGL扩展之前导入此小模块来在当前版本的PyOpenGL中对其进行修复:
import OpenGL.raw.WGL._types as t
from ctypes import _SimpleCData, _check_size
delattr(t.HANDLE, "final")
class HANDLE(_SimpleCData):
_type_ = "P"
_check_size(HANDLE)
HANDLE.final = True
t.HANDLE = HANDLE
t.HGLRC = HANDLE
t.HDC = HANDLE
t.HPBUFFERARB = HANDLE
t.HPBUFFEREXT = HANDLE
这将导入导致问题的PyOpenGL模块,撤消对c_void_p
的损坏,然后从上面的github链接中将HANDLE
变量及其别名重新分配给_SimpleCData
解决方案。 / p>