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_()
Cảm ơn rất nhiều! – YXD