我已经没有想法了,我需要一些帮助。请考虑以下代码片段(http://www.riverbankcomputing.com/pipermail/pyqt/2014-July/034542.html 年修改):
from OpenGL import GL
from PyQt5 import Qt
class GLWindow(Qt.QWindow):
def __init__(self):
super().__init__()
self.setSurfaceType(Qt.QWindow.OpenGLSurface)
self.context = Qt.QOpenGLContext()
self.context.setFormat(self.requestedFormat())
if not self.context.create():
raise Exception('self.context.create() failed')
self.create()
def exposeEvent(self, ev):
ev.accept()
if self.isExposed() and self.isVisible():
self.update()
def update(self):
self.context.makeCurrent(self)
GL.glClearColor(1.0, 0.0, 0.0, 0.0)
GL.glClearDepth(1)
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
GL.glFlush()
self.context.swapBuffers(self)
app = Qt.QApplication([])
win = GLWindow()
widget = Qt.QWidget.createWindowContainer(win, None, Qt.Qt.Widget)
widget.show()
app.exec_()
无论我在makeCurrent()之后调用什么OpenGL函数,它们都会引发以下异常:
File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (srcerrorchecker.c:1218)
OpenGL.error.GLError: GLError(
err = 1282,
description = b'nieprawidxb3owa operacja',
baseOperation = glClearColor,
cArguments = (1.0, 0.0, 0.0, 0.0)
)
此外,除了 openglwindow.py 之外,PyQt5 OpenGL 示例都不起作用。
我正在使用Python 3.4.2 win32,PyQt5 5.3.2和PyOpenGL 3.1.0。有什么想法吗?我发现 PyQt5 二进制文件可能是针对 OpenGL ES 构建的,但我不知道在使用 PyOpenGL 调用时这是否重要。
你应该使用 QtOpenGL.QGLWidget
.Qt.QWindow
没有使用OpenGL。
这是一个工作示例:
import struct
from PyQt5 import QtOpenGL, QtWidgets
import ModernGL
class QGLControllerWidget(QtOpenGL.QGLWidget):
def __init__(self):
fmt = QtOpenGL.QGLFormat()
fmt.setVersion(3, 3)
fmt.setProfile(QtOpenGL.QGLFormat.CoreProfile)
fmt.setSampleBuffers(True)
super(QGLControllerWidget, self).__init__(fmt, None)
def initializeGL(self):
self.ctx = ModernGL.create_context()
prog = self.ctx.program([
self.ctx.vertex_shader('''
#version 330
in vec2 vert;
void main() {
gl_Position = vec4(vert, 0.0, 1.0);
}
'''),
self.ctx.fragment_shader('''
#version 330
out vec4 color;
void main() {
color = vec4(0.30, 0.50, 1.00, 1.0);
}
'''),
])
vbo = self.ctx.buffer(struct.pack('6f', 0.0, 0.8, -0.6, -0.8, 0.6, -0.8))
self.vao = self.ctx.simple_vertex_array(prog, vbo, ['vert'])
def paintGL(self):
self.ctx.viewport = (0, 0, self.width(), self.height())
self.ctx.clear(0.9, 0.9, 0.9)
self.vao.render()
self.ctx.finish()
app = QtWidgets.QApplication([])
window = QGLControllerWidget()
window.move(QtWidgets.QDesktopWidget().rect().center() - window.rect().center())
window.show()
app.exec_()
我只能提供一种解决方法。
我也可以在窗口上重现问题。 glClearColor
调用不是问题。错误发生在context.create()
或self.create()
但 pyOpenGL 仅在第一次调用后检查错误时才注意到它。
我不知道真正导致问题的原因,但是如果我忽略错误,它可以正常工作。在__init__
末尾,我补充说:
self.context.makeCurrent(self)
GL.glGetError() # Ignore openGL error if one occured