Где или как компилировать шейдеры (программы) в PyQt5 / OpenGL - PullRequest
0 голосов
/ 04 ноября 2019

Я преобразовываю одно из моих приложений, использующих 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()

Может кто-нибудь дать подсказку, где искать дальше или что мне не хватает?

...