0

http://releases.qt-project.org/learning/developerguides/qtopengltutorial/OpenGLTutorial.pdfから QT OpenGL チュートリアルをダウンロードし、そこにある最も単純な例を実行しようとしています。黒の背景。

なんとかサンプルをコンパイルしましたが、実行すると黒いウィンドウしか表示されず、コンソールには次のように報告されます。

/home/minas/Desktop/hello-opengl-build-Desktop_Qt_5_0_1_GCC_64bit-Debug/hello-opengl を起動しています... QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていませんQGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていますリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムはリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムはリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムはリンクされていません QGLShaderProgram::attributeLocation( vertex ):シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません。 ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 ( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていませんuniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 ::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません。リンクされた QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんuniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 ::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません。リンクされた QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんuniformLocation( color ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 ::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんリンクされた QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんuniformLocation( color ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません。 ::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんリンクされた QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( mvpMatrix ): シェーダー プログラムがリンクされていません QGLShaderProgram::uniformLocation( color ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていませんシェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません QGLShaderProgram::attributeLocation( vertex ): シェーダー プログラムがリンクされていません

.pro ファイルは次のようになります ("unix:!mac" の部分は私が追加したため、OpenGL の .so ファイルが検出されます)。

QT += core gui opengl

TARGET = hello-opengl

TEMPLATE = app

SOURCES += main.cpp\
           glwidget.cpp

HEADERS += glwidget.h

OTHER_FILES += fragmentShader.fsh\
               vertexShader.vsh

RESOURCES += resources.qrc

unix:!mac{
    QMAKE_LFLAGS += -Wl,--rpath=/usr/lib64/nvidia-current
    QMAKE_LFLAGS += -L/usr/lib64/nvidia-current
}

「glxinfo | grep -i opengl」の出力は

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce 9800 GT/PCIe/SSE2
OpenGL version string: 2.1.2 NVIDIA 304.64
OpenGL shading language version string: (null)
OpenGL extensions:

実際のレンダリングを行うコードの部分は

void GlWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;

    // shaderProgram initialized in initializeGL()    
    shaderProgram.bind();

    // "mvpMatrix", "color" and "vertex" do exist in the shaders

    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);

    shaderProgram.setUniformValue("color", QColor(Qt::white));

    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");

    glDrawArrays(GL_TRIANGLES, 0, vertices.size());

    shaderProgram.disableAttributeArray("vertex");

    shaderProgram.release();
}

また、副次的な質問として、「glxinfo | grep -i opengl」の出力に行が含まれているのはなぜですか

OpenGL シェーディング言語のバージョン文字列: (null)

(ちょっと私に関係があるように思えます...そうですか?)


編集1

はのshaderProgramサブクラスで宣言されており、次のQGLWidgetように呼び出しGLWidgetて初期化しますinitializeGL

void GlWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    qglClearColor(QColor(Qt::black));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(1, 0, -2) << QVector3D(0, 1, -2) << QVector3D(-1, 0, -2);
}

編集2

ここに私の initializeGL() メソッドがあります:

void GlWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    qglClearColor(QColor(Qt::black));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(1, 0, -2) << QVector3D(0, 1, -2) << QVector3D(-1, 0, -2);
}

そして置く

qDebug() << shaderProgram.log();
exit(0);

上記の link() を呼び出した直後は、何も出力されません。

4

3 に答える 3

1

たった今これを見ていました。が true を返すので奇妙でしたlink()が、プログラムがリンクされていないと主張していましたか?

呼び出しbindAttributeLocation()の前に 2 つのステートメントを移動する必要があることがわかりました。link()リンク後にプログラムで使用するbindAttributeLocation()と、プログラムがリンクされなくなるようです。

違う:

    program.link();

    program.bindAttributeLocation("position", 0);
    program.bindAttributeLocation("texcoord", 1);

右:

    program.bindAttributeLocation("position", 0);
    program.bindAttributeLocation("texcoord", 1);

    program.link();
于 2013-09-12T02:55:29.087 に答える
-1

// shaderProgram はクラス コンストラクターで初期化されました

クラス コンストラクターでシェーダー ソース ファイルをコンパイルしてリンクした場合、それが原因である可能性が高くなります。QGLWidget の initializeGL メンバーをオーバーライドし、そこで OpenGL オブジェクトの初期化を行う必要があります。OpenGL コンテキストが確立されていないため、これより前にこれを行うことはできません。したがって、OpenGL オブジェクトを作成または管理することはできません。

于 2013-03-11T02:33:06.883 に答える