Windows中的PyOpenGL glClearColor错误,在linux中确定

时间:2016-10-19 06:39:41

标签: python windows pyopengl

我开发了一个基于jupyter笔记本的api,似乎在linux中运行良好,但是在Windows中我得到了这个错误,有些人提出这个错误与没有上下文被绘制,或者没有调用glClearColor()时的上下文。

不确定为什么linux环境可以处理它,但Windows中的jupyter没有它。

有什么建议吗?这是OpenGL中的错误吗?

C:\Python27\biovis\biovis\biovis\glwindow.py in initializeGL(self)
    132 
    133         if self.background=='black': GL.glClearColor(0.0, 0.0, 0.0, 1.0) # Black / White toggle switch
--> 134         if self.background=='white': GL.glClearColor(1.0, 1.0, 1.0, 1.0)
    135 
    136         GL.glClearDepth(10.0) # same as default

C:\Users\cm\Anaconda2\lib\site-packages\pyopengl-3.1.1a1-py2.7.egg\OpenGL\platform\baseplatform.pyc in __call__(self, *args, **named)
    400     def __call__( self, *args, **named ):
    401         if self.load():
--> 402             return self( *args, **named )
    403         else:
    404             from OpenGL import error

C:\Users\cm\Anaconda2\lib\site-packages\pyopengl-3.1.1a1-py2.7.egg\OpenGL\error.pyc in glCheckError(self, result, baseOperation, cArguments, *args)
    230                         result,
    231                         cArguments = cArguments,
--> 232                         baseOperation = baseOperation,
    233                     )
    234                 return result

GLError: GLError(
    err = 1282,
    description = 'invalid operation',
    baseOperation = glClearColor,
    cArguments = (1.0, 1.0, 1.0, 1.0)
)

编辑:

为了澄清为上面添加的一些代码,调用链通过GLWindow调用Widget,后者又加载一些数据并显式调用initializeGL(),updateGL()和paintGL()。

当调用initializeGL()并且没有任何函数可用时,会发生错误,也许小部件尚未准备好进行绘制?如果我评论这3个调用小部件确实加载但没有正确显示:屏幕是黑色的,只有在旋转它时我才能看到图形闪烁(旋转代码有它自己的updateGL()调用)。

我在某个地方错过了一个节目(),或者无序地调用了函数?但是为什么linux环境可以用它而不是windows? (也许安装的模块版本略有不同?)

class GLWindow(QtGui.QWidget):

     def __init__(self, fig, parent=None):
         QtGui.QWidget.__init__(self, parent)

         self.glWidget = GLWidget(fig, parent=self)

         mainLayout = QtGui.QHBoxLayout()
         mainLayout.addWidget(self.glWidget)

         self.setLayout(mainLayout)
         self.setWindowTitle(self.tr("Biovis"))

         self.show()

class GLWidget(QtOpenGL.QGLWidget):

    def __init__(self, fig, parent=None):
        QtOpenGL.QGLWidget.__init__(self, parent)

        self.setFocusPolicy(Qt.StrongFocus)
        self.lastPos = QtCore.QPoint()

        self.load_data_from_fig(fig)
        format = QtOpenGL.QGLFormat()

        format.setDoubleBuffer(True) # works fine
        self.setFormat(format)

    def load_data_from_fig(self, fig):

        self.background = fig.background
    ...

        self.initializeGL()  #Can comment these out and code works, but, the screen is black and the figure flickers in/out of existence while rotating
        self.updateGL()
        self.paintGL()

    def initializeGL(self):

        GL.glClearColor(1.0, 1.0, 1.0, 1.0)
        GL.glClearDepth(10.0) # same as default
        GL.glEnable(GL.GL_DEPTH_TEST) # 
    ...

1 个答案:

答案 0 :(得分:0)

下面是一个pyqt4 opengl演示,它在windows和linux上成功呈现一个简单的三角形。请注意,我不会调用self.paintGL()或类似的内容,因为这些*GL命令已定义并自动调用pyqt库。

import sys
import math
from PyQt4 import QtCore, QtGui, QtOpenGL
from OpenGL.GL import *

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.glWidget = GLWidget()
        mainLayout = QtGui.QHBoxLayout()
        mainLayout.addWidget(self.glWidget)
        mainLayout.setContentsMargins(0,0,0,0)
        self.setLayout(mainLayout)
        self.setWindowTitle("Biovis")

class GLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):
        super(GLWidget, self).__init__(parent)

    def minimumSizeHint(self):
        return QtCore.QSize(200, 200)

    def sizeHint(self):
        return QtCore.QSize(400, 400)

    def initializeGL(self):
        glClearColor(1, 0, 0, 1)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glBegin(GL_TRIANGLES)
        glVertex(-1, -1, 0)
        glVertex(0, 1, 0)
        glVertex(1, -1, 0)
        glEnd()

    def resizeGL(self, width, height):
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glViewport(0, 0, width, height)
        glOrtho(-1, 1, -1, 1, -1, 1)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

让我知道这是否成功为您服务!