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.
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
Vous devez vous connecter pour publier un commentaire.
Vous devez déplacer l'OpenGL requêtes vers le bas après
mainView.show();
. Avantshow()
le contexte OpenGL n'a pas été initialisé.OriginalL'auteur Mortennobel
Version courte: mise à jour de Qt5, c'est corrigé.
P. S Et si vous pouvez utiliser 5.4 vous devriez probablement utiliser QtOpenGL... classes au lieu de QGL....
Version longue:
Donc, au cas où quelqu'un jamais rencontré un problème comme celui-ci.
J'ai essayé de créer, non PAS d'OpenGL 3.0 contexte avec mon Intel HD3000 sur ubuntu 14.04 et Qt 4.8.6. Je suis venu avec ce test de code fourni à la fin de la réponse. Essayé de créer 3.1, 1.2, 2.1, etc.. contextes Core Compatible.. mais toujours avec
context->format().majorVersion()
montrant la version demandée, etglGetString(GL_VERSION)
montrant 3.0.Après environ 3 heures, j'ai remarqué que, par défaut, Qt Creator utilise Qt4 à la place de ces dernières Qt 5, installé sur mon système. Et après j'ai recompilé le projet avec Qt 5.2.1 exactement le même code commencé à travailler comme prévu.
Espérant que cela puisse aider quelqu'un.
OriginalL'auteur xelez