8

PyQt で基本的なシェーダー プログラムを動作させることができません。これは少なくともシェーダー コードを正しくコンパイルする必要があると思いますが (私はここでは専門家ではありません)、addShaderFromSourceFile()何を試しても常に false を返します。シェーダー プログラム ログも常に空です。

私は Ubuntu 12.04 を使用しており、C++ で GLSL シェーダー プログラムをコンパイルして実行できます。なので、システムの問題ではないと思います。

ファイルshader.vert

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

ファイルshader.frag

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

2 に答える 2

6

OpenGL コンテキストはコンストラクター内でセットアップされません。それは paintGL、resizeGL、および initializeGL メソッド内でのみ有効で最新であるため、initializeGL メソッド内でシェーダーをロードおよびコンパイルする必要があり、他の場所ではありません。

于 2012-06-25T22:05:49.563 に答える