Я преобразовываю одно из моих приложений, использующих GLUT, в приложение PyQt5 и изо всех сил пытаюсь получить программы, скомпилированные из моих шейдеров. Шейдеры компилируются нормально, но фактический вызов OpenGL.GL.shaders.compileProgram()
дает:
Traceback (most recent call last):
File "mwe.py", line 42, in initializeGL
gls.compileProgram(vertex_shader, fragment_shader)
File "/usr/local/lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 196, in compileProgram
program.check_validate()
File "/usr/local/lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 108, in check_validate
glGetProgramInfoLog( self ),
RuntimeError: Validation failure (0): b'Validation Failed: Current draw framebuffer is invalid.\n'
[1] 34795 abort python mwe.py
Ошибка Current draw framebuffer is invalid
, поэтому я предполагаю, что что-то с контекстом OpenGL испорчено, но не может выяснить. Я нашел только Компиляция шейдеров в PyQt , но я компилирую внутри функции, где присутствует контекст OpenGL.
Код работает в приложении GLUT, где я в основном вызываю те же самые команды OpenGL вэтот приказ.
Вот MWE:
#!/usr/bin/env python
import sys
import PyQt5.QtCore as qc
import PyQt5.QtWidgets as qw
import OpenGL.GL as gl
import OpenGL.arrays as gla
import OpenGL.GL.shaders as gls
class MainWindow(qw.QWidget):
def __init__(self):
super(qw.QWidget, self).__init__()
self.gl_widget = MainCanvas()
layout = qw.QHBoxLayout()
layout.addWidget(self.gl_widget)
self.setLayout(layout)
class MainCanvas(qw.QOpenGLWidget):
def __init__(self, parent=None):
super(qw.QOpenGLWidget, self).__init__(parent)
def initializeGL(self):
gl.glClearDepth(1.0)
gl.glClearColor(0.0, 0.0, 0.0, 0.0)
gl.glLoadIdentity()
vertex_shader = gls.compileShader(
"""
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}""", gl.GL_VERTEX_SHADER)
fragment_shader = gls.compileShader(
"""
void main() {
gl_FragColor = vec4(0.5, 0.5, 0.5, 1);
}""", gl.GL_FRAGMENT_SHADER)
gls.compileProgram(vertex_shader, fragment_shader)
def minimumSizeHint(self):
return qc.QSize(100, 100)
def sizeHint(self):
return qc.QSize(500, 500)
def paintGL(self):
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
def main():
app = qw.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Может кто-нибудь дать подсказку, где искать дальше или что мне не хватает?