2012-06-12 11 views
9

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をサポートしていることを示しています。ドライバのバージョンは上記のサンプル出力に表示されています。他に何をしようとしているのか分からない。

編集:私はこの編集の前に問題の私の説明といくつかのかなり悪いミス/仮定をしました。問題はまだ似ていますが、うまくいけばもう少し意味があります。混乱を招いて申し訳ありません。

+0

シェーダはコンパイル/リンクしていますか? 4.2コンテキストと互換性のない/間違ったシェーダを使用している場合、それが空白のウィンドウの原因の1つです。 –

+0

私はまだそれを得ていない(シェイダー)。 QDeclarativeViewのビューポートとしてQGLWidgetを使用し、シェーダを使用した3Dコンテンツを追加したかったのです。しかし、Rectangle {}のようなデフォルトのコンポーネントを持つ単純なファイルでさえ、何も描画されません。私がQGLFormatのバージョンを設定しないと、期待どおりにレンダリングされますが、なぜこの質問の全体が最初に設定できないのかがわかります。また、互換性のないシェーダを使用している場合(または内部的にQtを使用する場合)、エラーが発生します。唯一の結果は私の質問に貼り付けたものです。 – Prismatic

+0

ええと、私がシェイダーログを見ることを推奨する唯一の理由は、OpenGL 3.0以降では、独自のシェーダーをコンパイルしてロードする必要があることです。私はQTを通してOpenGLを使用することについての経験がないので、どれだけあなたのために処理されるのかわかりません。ただし、リンクした例では、作成者は自分のシェーダを準備します。コアプロファイルを使用してグラフィックスカードにシェーダを提供しない場合は、何もレンダリングされません。 –

答えて

4

あなたはOpenGLがmainView.show();後にダウン照会移動する必要があります。 show()の前に、OpenGLコンテキストが初期化されていません。

2

ショートバージョン:Qt5に更新、それはそこに固定されます。

P.Sそして、あなたはおそらく代わりにQGLのQtOpenGL ...クラスを使用する必要があります5.4を使用することができるならば...もの。

ロングバージョン: 誰かがこのような問題に遭遇した場合に備えて。

私はUbuntuの14.04とQt 4.8.6に私のインテルHD3000でのOpenGLはありません3.0コンテキストを作成しようとしました。私は答えの最後にこのテストコードを用意しました。 3.1,1.2,1.2などのコンテキストを作成しようとしました。コア互換ですが、常にcontext->format().majorVersion()が要求されたバージョンを示し、glGetString(GL_VERSION)が3.0となってしまいます。

は、約3時間後、私は、デフォルトではQt Creatorは私のシステムにインストールされ、最近のQt 5の代わりにQt4をを使用していることに気づきました。 Qt 5.2.1でプロジェクトを再コンパイルした後、同じコードが正確に動作するようになりました。

これは誰かを助けるかもしれないと思っています。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.show(); 

    QGLFormat glFormat; 
    glFormat.setVersion(3, 1); 
    glFormat.setProfile(QGLFormat::NoProfile); 
    glFormat.setSampleBuffers(true); 
    glFormat.setDefaultFormat(glFormat); 
    glFormat.setSwapInterval(1); 
    QGLWidget widget(glFormat); 
    widget.makeCurrent(); 

    const QGLContext *context = widget.context(); 

    glewExperimental = GL_TRUE; 
    if (glewInit() != GLEW_OK) { 
     qWarning("Failed to initialize GLEW\n"); 
    } 
    qDebug() << "Context valid: " << context->isValid(); 
    qDebug() << "Really used OpenGl: " << context->format().majorVersion() << "." << context->format().minorVersion(); 
    qDebug() << "OpenGl information: VENDOR:  " << (const char*)glGetString(GL_VENDOR); 
    qDebug() << "     RENDERDER: " << (const char*)glGetString(GL_RENDERER); 
    qDebug() << "     VERSION:  " << (const char*)glGetString(GL_VERSION); 
    qDebug() << "     GLSL VERSION: " << (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); 
    qDebug() << "endstuff\n"; 

    return a.exec(); 
} 
関連する問題