2016-01-28 59 views
1

我是Python和PyOpenGL的新手。試圖將我的C++代碼移植到PyOpenGL,我嘗試使用調試消息傳遞功能並定義了以下代碼。我如何在PyOpenGL中使用glDebugMessageCallback

def onDebugMessage(*args, **kwargs): 
    println('args = {0}, kwargs = {1}'.format(args, kwargs)) 

def initializeGL(self): 
    super().initializeGL() 
    glEnable(GL_DEBUG_OUTPUT) 
    glDebugMessageCallback(onDebugMessage, None) 
    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, None, GL_TRUE) 
    glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Starting debug messaging service") 

不幸的是,它在調用glDebugMessageCallback時崩潰了。

錯誤消息如下:

Traceback (most recent call last): 
File "debug.py", line 12, in initializeGL 
    glDebugMessageCallback(onDebugMessage, None) 
File "C:\Python34\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__ 
    return self(*args, **named) 
ctypes.ArgumentError: argument 1: <class 'TypeError'>: expected WinFunctionType instance instead of function 

這是否意味着我需要養活的原始功能和它是不可能與Python回調代碼呢?

感謝您的建議。

回答

1

我剛碰到相同的錯誤。這是我想出瞭解決方案的自足例如:

from OpenGL import GL as gl 
import cyglfw3 as glfw 

def cb_dbg_msg(source, msg_type, msg_id, severity, length, raw, user): 
    msg = raw[0:length] 
    print 'debug', source, msg_type, msg_id, severity, msg 

glfw.Init() 
glfw.WindowHint(glfw.CONTEXT_VERSION_MAJOR, 3) 
glfw.WindowHint(glfw.CONTEXT_VERSION_MINOR, 2) 
glfw.WindowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) 
glfw.WindowHint(glfw.OPENGL_DEBUG_CONTEXT, True) 

window = glfw.CreateWindow(640, 480, "test") 
glfw.MakeContextCurrent(window) 

# Install our debug message callback 
gl.glDebugMessageCallback(gl.GLDEBUGPROC(cb_dbg_msg), None) 

# This shader program doesn't exist so you can expect the debug 
# message callback to receive an error message 
gl.glUseProgram(1234) 

並運行它的一個例子:

$ virtualenv venv 
$ . venv/bin/activate 
$ pip install cyglfw3==3.1.0.2 PyOpenGL==3.1.0 
$ python gldbg.py 
debug 33350 33356 2 37190 GL_INVALID_VALUE in glUseProgram 
Traceback (most recent call last): 
    File "gldbg.py", line 22, in <module> 
    gl.glUseProgram(1234) 
    File "/home/nicholasbishop/pygldbg/venv/lib/python2.7/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__ 
    return self(*args, **named) 
    File "/home/nicholasbishop/pygldbg/venv/lib/python2.7/site-packages/OpenGL/error.py", line 232, in glCheckError 
    baseOperation = baseOperation, 
OpenGL.error.GLError: GLError(
    err = 1281, 
    description = 'invalid value', 
    baseOperation = glUseProgram, 
    cArguments = (1234,) 
) 
+0

感謝您的解決方案。 GLDEBUGPROC包裝也爲我工作。但是,我仍然無法使其工作。看來我的問題部分是由於我無法使用PyQt 5 GLWidget獲取調試上下文而導致的。但這是另一個問題。 – ken