2012-06-25 13 views
7

Nie mogę uzyskać podstawowego programu cieniującego działającego w PyQt. Myślę, że to powinno przynajmniej poprawnie skompilować kod cieniowania (nie jestem tu ekspertem), ale zawsze zwracam wartość false bez względu na to, co próbuję. Dziennik programu cieniującego jest zawsze pusty.Kompilowanie shaderów w PyQt

Jestem na Ubuntu 12.04, i mogę skompilować i uruchomić programy cieniowania GLSL w C++. Więc nie sądzę, że to problem systemowy.

pliku shader.vert

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

pliku shader.frag

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

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

Odpowiedz

6

OpenG Kontekst L nie jest ustawiony wewnątrz konstruktora, jest poprawny i aktualny w metodach paintGL, resizeGL i initializeGL, więc powinieneś ładować i kompilować shadery w ramach metody initializeGL, a nie nigdzie indziej.

+0

Dziękuję bardzo! – YXD