Qt 4.8.2でQGLWidgetを使用しようとしています。私は、QGLWidgetが作成するデフォルトコンテキストが3.1以上のOpenGLの出力を表示していないことに気付きました。 The Qt wiki has a tutorialは、OpenGL 3.3を使用して単純な三角形を描画する方法を示しています。チュートリアルを実行しようとすると、空白の画面が表示されます。 OpenGLのバージョンを3.1に変更すると、予想される出力(赤い三角形)が表示されます。QGLWidgetで希望のOpenGLバージョンを設定できません
私のビデオカードはOpenGL 4.2をサポートしており、QGLWidgetを作成する前にQGLFormat::openGLVersionFlags()
を呼び出すと、OpenGL 4.2およびそれ以前のすべてのデスクトップバージョンが検出されます。ここで
#include <QApplication>
#include <QGLWidget>
#include <QDebug>
#include <QtDeclarative/qdeclarativeview.h>
int main(int argc, char * argv[])
{
QApplication app(argc, argv);
qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags();
QGLFormat qglFormat;
qglFormat.setVersion(4,2); // get expected output with (3,1) and below, else blank window
qglFormat.setProfile(QGLFormat::CoreProfile);
qglFormat.setSampleBuffers(true);
QGLWidget* qglWidget = new QGLWidget(qglFormat);
QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
qDebug() << "Driver Version String:" << versionString;
qDebug() << "Current Context:" << qglWidget->format();
QDeclarativeView mainView;
mainView.setViewport(qglWidget);
mainView.setSource(QString("helloworld.qml"));
mainView.show();
return app.exec();
}
を出力です:
はここで別の最小限の例です
OpenGL Versions Supported: QFlags(0x1|0x2|0x4|0x8|0x10|0x20|0x40|0x1000|0x2000|0x4000|0x8000|0x10000)
Driver Version String: "4.2.0 NVIDIA 295.53"
Current Context: QGLFormat(options QFlags(0x1|0x2|0x4|0x10|0x20|0x80|0x200|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize 16 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize -1 , samples 4 , swapInterval 0 , majorVersion 4 , minorVersion 2 , profile 1)
最初の行にQFlags()
列挙型のリストは、サポートされているOpenGLのバージョンを記述します。リストには、OpenGL/ESバージョンを除くすべてのバリアントがサポートされています。 3行目のQFlags()は、フォーマットオプション(アルファチャンネル、ステンシルバッファなど)を記述します。
QGLWidgetが> = 3.1以上で動作しない理由を知っていますか?私はLinux上にあり、Nvidia GT440を持っており、glxinfoはOpenGL 4.2.0をサポートしていることを示しています。ドライバのバージョンは上記のサンプル出力に表示されています。他に何をしようとしているのか分からない。
編集:私はこの編集の前に問題の私の説明といくつかのかなり悪いミス/仮定をしました。問題はまだ似ていますが、うまくいけばもう少し意味があります。混乱を招いて申し訳ありません。
シェーダはコンパイル/リンクしていますか? 4.2コンテキストと互換性のない/間違ったシェーダを使用している場合、それが空白のウィンドウの原因の1つです。 –
私はまだそれを得ていない(シェイダー)。 QDeclarativeViewのビューポートとしてQGLWidgetを使用し、シェーダを使用した3Dコンテンツを追加したかったのです。しかし、Rectangle {}のようなデフォルトのコンポーネントを持つ単純なファイルでさえ、何も描画されません。私がQGLFormatのバージョンを設定しないと、期待どおりにレンダリングされますが、なぜこの質問の全体が最初に設定できないのかがわかります。また、互換性のないシェーダを使用している場合(または内部的にQtを使用する場合)、エラーが発生します。唯一の結果は私の質問に貼り付けたものです。 – Prismatic
ええと、私がシェイダーログを見ることを推奨する唯一の理由は、OpenGL 3.0以降では、独自のシェーダーをコンパイルしてロードする必要があることです。私はQTを通してOpenGLを使用することについての経験がないので、どれだけあなたのために処理されるのかわかりません。ただし、リンクした例では、作成者は自分のシェーダを準備します。コアプロファイルを使用してグラフィックスカードにシェーダを提供しない場合は、何もレンダリングされません。 –