Ne pouvez pas régler la version d'OpenGL dans QGLWidget

Je suis en train d'utiliser QGLWidget dans Qt 4.8.2. J'ai remarqué que le contexte par défaut QGLWidget crée ne présente pas de sortie pour l'OpenGL 3.1 ci-dessus. L'intervalle Qt wiki a un tutoriel qui illustre l'utilisation d'OpenGL 3.3 pour dessiner un triangle simple. Lorsque j'essaie d'exécuter le tutoriel, j'obtiens un écran vide. Si je change la version d'OpenGL pour 3.1, j'obtiens le résultat escompté (triangle rouge).

Ma carte vidéo prend en charge OpenGL 4.2, et en appelant QGLFormat::openGLVersionFlags() avant la création de la QGLWidget montre que Qt détecte OpenGL 4.2 et toutes les précédentes versions de bureau.

Voici un autre exemple minimal:

#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();
}

Voici le résultat:

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 )  

La QFlags() enum liste sur la première ligne décrit l'OpenGL versions prises en charge. La liste montre, j'ai en charge toutes les variantes, sauf pour l'OpenGL/ES versions. QFlags() sur la troisième ligne décrit les options de format (canal alpha, pochoir, tampon, etc).

Ce que quelqu'un sait pourquoi QGLWidget ne fonctionne pas avec quoi que ce soit >= 3.1? Je suis sous Linux, Nvidia GT440, et glxinfo montre qu'il prend en charge OpenGL 4.2.0. La version du pilote est imprimé dans l'exemple de sortie ci-dessus. Je ne sais pas trop quoi d'autre pour essayer.

Edit: j'ai fait un assez mauvais erreurs/hypothèses avec mon explication du problème avant cette édition. Le problème n'est toujours similaire, mais espérons-le, un sens un peu plus maintenant. Désolé pour la confusion.

Sont vos shaders compilation/liaison? Si vous utilisez un 4.2 contexte et incompatible/incorrect shaders, qui est l'une des causes pour une fenêtre vide.
Je ne suis pas allé bien loin pourtant (shaders). Je voulais utiliser QGLWidget comme une fenêtre d'affichage pour un QDeclarativeView et puis ajouter un peu de contenu en 3d qui a utilisé des shaders. Mais même un simple fichier avec des composants par défaut comme un Rectangle{} ne rend rien. Il va rendre comme prévu si je n'ai pas mis le QGLFormat version, mais tout l'intérêt de cette question est de comprendre pourquoi je ne peux pas le définir en premier lieu. De Plus, j'avais des messages d'erreurs si je (ou Qt interne) a été à l'aide incompatible shaders. La seule sortie est ce que j'ai collé dans ma question.
Hmm, la seule raison pour laquelle je suggère de regarder le shader journal, c'est qu'OpenGL 3.0 + exige que vos propres shaders sont compilés et chargés, tout en OpenGL 2.0 et au-dessous ne fonctionne pas. Je n'ai pas d'experiance avec l'aide d'OpenGL par QT, donc je ne sais pas comment est fait pour vous. Cependant, dans l'exemple que vous avez lié, l'auteur prépare ses propres shaders. Si vous ne fournissez pas les shaders de la carte graphique en utilisant le profil de base, vous n'aurez pas de rendre quoi que ce soit.
Je viens de téléchargé et exécuté l'exemple que j'ai lié, et ça ne fonctionne pas (vide) à moins que je l'ai mis à utiliser la compatibilité de profil, par opposition à la base du profil.
Toute erreur lorsque vous exécutez l'utilisation de core?

OriginalL'auteur Prismatic | 2012-06-12