Компиляция шейдеров в PyQt
Я не могу заставить базовую программу шейдеров работать в PyQt. Я думаю, что это должно по крайней мере правильно скомпилировать код шейдера (я здесь не эксперт), но addShaderFromSourceFile()
всегда возвращает false независимо от того, что я пытаюсь. Журнал программы shader также всегда пуст.
Я на Ubuntu 12.04, и я могу компилировать и запускать программы шейдеров GLSL на C++. Поэтому я не думаю, что это системная проблема.
шейдер.vertvoid main(void)
{
gl_Position = ftransform();
}
шейдер.фраг!--10-->
void main(void)
{
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
файл 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_()
1 ответов
контекст OpenGL не настраивается внутри конструктора, он действителен только внутри методов paintGL, resizeGL и initializeGL, поэтому вы должны загружать и компилировать шейдеры внутри метода initializeGL, а не где-либо еще.