2017-04-14 128 views
0

我想弄清楚如何使用renderdoc来调试我的一些python opengl应用程序。在这一刻,我的一些python opengl测试正在使用pyopengl(glut)或pyqt。这里是展示了如何initalize要么过剩或PyQt的一对夫妇的最小测试:如何在python opengl应用程序中使用renderdoc

GLUT

from ctypes import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 

if __name__ == "__main__": 
    def display(): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glLoadIdentity() 
     glutSwapBuffers() 

    glutInit(sys.argv) 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
    glutInitWindowSize(800, 600) 
    glutInitWindowPosition(800, 100) 

    glutCreateWindow(b'TestGLUT') 
    glutDisplayFunc(display) 

    glClearColor(1.0, 0.0, 0.0, 0.0) 

    glutMainLoop() 

如果我启动renderdoc使用可执行文件路径(蟒蛇路径)和命令上面的代码片段-Line参数(-u path_to_the_glut_example.py)我会得到这样的输出:

enter image description here

PyQt的

from OpenGL.GL import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 

from PyQt5 import QtWidgets 
from PyQt5.QtOpenGL import QGLWidget 

class Foo(QGLWidget): 
    def __init__(self, *args, **kwargs): 
     super(Foo, self).__init__(*args, **kwargs) 

    def initializeGL(self): 
     glClearColor(1.0, 0.0, 0.0, 0.0) 

    def paintGL(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 

if __name__ == "__main__": 
    global app 
    app = QtWidgets.QApplication(sys.argv) 
    ex = Foo() 
    ex.move(800,100) 
    ex.resize(800, 600) 
    ex.show() 

    sys.exit(app.exec_()) 

如果我启动renderdoc使用可执行文件路径(蟒蛇路径)和命令行参数(-u path_to_the_pyqt_example.py)我会得到这个输出上面的代码片段:

enter image description here

那么,事情是我不知道如何既不glutCreateWindow(G lut)也不是初始化GL(pyqt)正在初始化幕后的opengl上下文,但看起来renderdoc并不喜欢他们创建opengl上下文的方式。我想知道如何使用glut & pyqt测试工作renderdoc。

顺便注意:

glGetIntegerv(GL_MAJOR_VERSION) ---> 4 
glGetIntegerv(GL_MINOR_VERSION) ---> 5 

所以,这个问题是不是上下文的OpenGL版本(这是不够好),但它已经创建的方式。

回答

1

官方GLUT不支持任何现代OpenGL上下文。然而,freeglut有一些扩展,PyOpenGL确实有support those extensions。由于freeglut是当今最积极开发的GLUT实现,并且也适用于所有主流桌面平台,因此依靠freeglut是非常安全的。您只需要在创建窗口之前添加

glutInitContextVersion(3,2) # at least 3.2 is required, you can use a higer version when needed 
glutInitContextProfile(GLUT_CORE_PROFILE) 
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE) 

但不是说你的代码现在会在glLoadIdentity上产生一个GL错误,因为这个弃用函数根本不可用在核心配置文件OpenGL中。

如果你想要去Qt路线,事情在概念上是相同的。 Qt拥有的QGLFormat class对付这种特性,所以你的例子就变成:

from sys import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 

from PyQt5 import QtWidgets 
from PyQt5.QtOpenGL import QGL 
from PyQt5.QtOpenGL import QGLWidget 
from PyQt5.QtOpenGL import QGLFormat 

class Foo(QGLWidget): 
    def __init__(self, *args, **kwargs): 
     fmt = QGLFormat() 
     fmt.setVersion(3,2) 
     fmt.setProfile(QGLFormat.CoreProfile) 
     fmt.setOption(QGL.NoDeprecatedFunctions) # a.k.a. forward compatible 
     super(Foo, self).__init__(fmt, *args, **kwargs) 

    def initializeGL(self): 
     glClearColor(1.0, 0.0, 0.0, 0.0) 
     print(glGetString(GL_VERSION)) 

    def paintGL(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     #glMatrixMode(GL_MODELVIEW) !!! not supported in core profile 
     #glLoadIdentity() !!! not supported in core profile 

if __name__ == "__main__": 
    global app 
    app = QtWidgets.QApplication(argv) 
    ex = Foo() 
    ex.move(800,100) 
    ex.resize(800, 600) 
    ex.show() 

    exit(app.exec_()) 

我基本上只延长了__init__方法,但我不得不从PyQt5导入一对夫妇的更多的东西。请注意,我也删除了GLUT导入,因为在使用Qt时根本不需要导入。

这两个示例都使用python3在我的Linux系统上创建了一个核心配置文件。我不知道renderdoc现在是否会满足您提供的上下文。这些更改至少可以解决它为原始示例提供的错误消息,原则上它应该可以正常工作。

相关问题