2012-06-25 41 views
7

Tôi không thể có được một chương trình đổ bóng cơ bản hoạt động trong PyQt. Tôi nghĩ rằng điều này ít nhất nên biên dịch mã shader một cách chính xác (tôi không có chuyên gia ở đây), nhưng addShaderFromSourceFile() luôn luôn trả về false không có vấn đề gì tôi cố gắng. Nhật ký chương trình đổ bóng luôn trống.Biên dịch bóng đổ trong PyQt

Tôi đang sử dụng Ubuntu 12.04 và tôi có thể biên dịch và chạy chương trình shader GLSL trong C++. Vì vậy, tôi không nghĩ rằng đó là một vấn đề hệ thống.

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

Trả lời

6

Các OpenG Ngữ cảnh L không được thiết lập bên trong hàm tạo, nó chỉ hợp lệ và hiện tại bên trong các phương thức paintGL, resizeGL và initializeGL, do đó bạn nên tải và biên dịch các trình đổ bóng bên trong phương thức initializeGL và không phải ở bất kỳ đâu.

+0

Cảm ơn rất nhiều! – YXD

Các vấn đề liên quan