Python 在PyQt中编译着色器
我无法让一个基本的着色器程序在PyQt中工作。我认为这至少应该正确编译着色器代码(我在这里不是专家),但是无论我尝试什么,Python 在PyQt中编译着色器,python,qt,opengl,pyqt,glsl,Python,Qt,Opengl,Pyqt,Glsl,我无法让一个基本的着色器程序在PyQt中工作。我认为这至少应该正确编译着色器代码(我在这里不是专家),但是无论我尝试什么,addShaderFromSourceFile()总是返回false。着色器程序日志也始终为空 我在Ubuntu 12.04上,可以在C++中编译和运行GLSL着色器程序。所以我不认为这是一个系统问题 文件shader.vert 文件shader.frag 文件test_shaders.py OpenGL上下文不是在构造函数中设置的,它只在paintGL、resizeGL和i
addShaderFromSourceFile()
总是返回false。着色器程序日志也始终为空
我在Ubuntu 12.04上,可以在C++中编译和运行GLSL着色器程序。所以我不认为这是一个系统问题
文件shader.vert
文件shader.frag
文件test_shaders.py
OpenGL上下文不是在构造函数中设置的,它只在paintGL、resizeGL和initializeGL方法中有效且最新,因此您应该在initializeGL方法中加载和编译着色器,而不是在其他任何地方。我相信另一个答案现在可能已经过时了。至少自PyQt5以来,有一种方法可以使小部件的OpenGL上下文成为当前的(并在之后进行清理) 它可以通过
QGlWidget
上的和方法实现
解决方案如下所示:
。。。
类示例示例QGLWidget(QGLWidget):
定义初始化(自身,父级):
QGLWidget.\uuuuu init\uuuuuuu(自我,父)
self.shaderProgram=QGLShaderProgram()
self.makeCurrent()
打印self.shaderProgram.addShaderFromSourceFile(QGLShader.Vertex,“shader.vert”)
打印self.shaderProgram.addShaderFromSourceFile(QGLShader.Fragment,“shader.frag”)
打印self.shaderProgram.log()
self.shaderProgram.link()
self.doneCurrent()
glViewport(0,060480)
...
void main(void)
{
gl_Position = ftransform();
}
void main(void)
{
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt4 import QtCore, QtGui
from PyQt4.QtOpenGL import *
class ExampleQGLWidget(QGLWidget):
def __init__(self, parent):
QGLWidget.__init__(self, parent)
self.shaderProgram = QGLShaderProgram()
print self.shaderProgram.addShaderFromSourceFile(QGLShader.Vertex, "shader.vert")
print self.shaderProgram.addShaderFromSourceFile(QGLShader.Fragment, "shader.frag")
print self.shaderProgram.log()
self.shaderProgram.link()
glViewport(0,0, 640, 480)
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
self.shaderProgram.bind()
def resizeGL(self, w, h):
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
def initializeGL(self):
glClearColor(0.0, 0.0, 0.0, 1.0)
glClearDepth(1.0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
class TestContainer(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
widget = ExampleQGLWidget(self)
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QtGui.QApplication(['Shader Example'])
window = TestContainer()
window.show()
app.exec_()