2012-06-25 96 views
7

我無法獲得在PyQt中工作的基本着色器程序。我認爲這應該至少能夠正確地編譯着色器代碼(我在這裏不是專家),但是無論我嘗試什麼,addShaderFromSourceFile()都會返回false。着色器程序日誌也一直是空的。在PyQt中編譯着色器

我在Ubuntu 12.04上,我可以在C++中編譯和運行GLSL着色器程序。所以我不認爲這是一個系統問題。

文件shader.vert

void main(void) 
{ 
    gl_Position = ftransform(); 
} 

文件shader.frag

void main(void) 
{ 
    gl_FragColor = vec4(1.0,0.0,0.0,1.0); 
} 

文件test_shaders.py

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_() 

回答

6

的OpenG L上下文不是在構造函數內部設置的,它只在paintGL,resizeGL和initializeGL方法內部有效並且是當前的,所以你應該在initializeGL方法中加載和編譯着色器,而不是其他地方。

+0

非常感謝! – YXD