2012-06-25 16 views
7

Non riesco a ottenere un programma shader di base che funzioni in PyQt. Penso che questo dovrebbe almeno compilare correttamente il codice shader (non sono esperto qui), ma addShaderFromSourceFile() restituisce sempre false indipendentemente da ciò che provo. Anche il log del programma shader è sempre vuoto.Compilazione di shader in PyQt

Sono su Ubuntu 12.04 e posso compilare ed eseguire programmi shader GLSL in C++. Quindi non penso che sia un problema di sistema.

File shader.vert

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

File shader.frag

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

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

risposta

6

L'OpenG Il contesto L non è impostato all'interno del costruttore, è solo valido e corrente all'interno dei metodi paintGL, resizeGL e initializeGL, quindi è necessario caricare e compilare gli shader all'interno del metodo initializeGL, e non altrove.

+0

Grazie mille! – YXD