在PyQt5 / OpenGL中在何处或如何编译着色器(程序)

我正在将使用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上下文有些混乱,但无法弄清楚。我只找到了Compiling shaders in 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)
        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,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()

任何人都可以提示下一个地方或我想念的地方吗?

cb46124994 回答:在PyQt5 / OpenGL中在何处或如何编译着色器(程序)

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3169711.html

大家都在问