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() を呼び出した直後は、何も出力されません。