2012-06-25 26 views
7

PyQt içinde çalışan temel bir gölgelendirici program alamıyorum. Bunun en azından shader kodunu doğru bir şekilde derlemesi gerektiğini düşünüyorum (burada uzman değilim) ama addShaderFromSourceFile() denediğim şey her zaman yanlıştır. Gölgelendirici program günlüğü her zaman boştur.PyQt içinde derleme gölgelendiricileri

Ubuntu 12.04'deyim ve GLSL shader programlarını C++ içinde derleyip çalıştırabilirim. Yani bunun bir sistem sorunu olduğunu düşünmüyorum.

Dosya shader.vert

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

Dosya shader.frag

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

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

cevap

6

OpenG L içerik kurucunun içinde ayarlanmamıştır, yalnızca paintGL, resizeGL ve initializeGL yöntemlerinde geçerli ve günceldir, böylece shader'ları initializeGL yönteminin içine ve başka bir yere yerleştirip derlemelisiniz.

+0

Çok teşekkürler! – YXD