我正在将使用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()
任何人都可以提示下一个地方或我想念的地方吗?