2012-06-25 12 views
7

que no pueden obtener un programa básico de trabajo de sombreado en PyQt. Creo que esto debería al menos compilar el código del sombreador correctamente (no soy un experto aquí), pero addShaderFromSourceFile() siempre devuelve falso sin importar lo que intento. El registro del programa de sombreado siempre está vacío también.shaders Compilar en PyQt

Estoy en Ubuntu 12.04, y puedo compilar y ejecutar programas de sombreado GLSL en C++. Entonces no creo que sea un problema del sistema.

Archivo shader.vert

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

Archivo shader.frag

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

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

Respuesta

6

El OpenG El contexto L no está configurado dentro del constructor, solo es válido y actual dentro de los métodos paintGL, resizeGL e initializeGL, por lo que debe cargar y compilar sombreadores dentro del método initializeGL, y no en ningún otro lado.

+0

¡Muchas gracias! – YXD