nicht einstellen Ich versuche QGLWidget in Qt 4.8.2 zu verwenden. Ich habe bemerkt, dass der Standardkontext, den QGLWidget erstellt, keine Ausgabe für OpenGL über 3.1 zeigt. The Qt wiki has a tutorial zeigt, dass mit OpenGL 3.3 ein einfaches Dreieck gezeichnet wird. Wenn ich versuche, das Tutorial auszuführen, bekomme ich einen leeren Bildschirm. Wenn ich die OpenGL-Version auf 3.1 ändere, bekomme ich die erwartete Ausgabe (ein rotes Dreieck).Kann gewünschte OpenGL-Version in QGLWidget
Meine Grafikkarte unterstützt OpenGL 4.2, und das Aufrufen von QGLFormat::openGLVersionFlags()
vor dem Erstellen des QGLWidget zeigt, dass Qt OpenGL 4.2 und alle früheren Desktopversionen erkennt.
Hier ist ein weiteres Beispiel 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();
}
Hier ist der Ausgang:
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)
Die QFlags()
Aufzählungsliste in der ersten Zeile werden die OpenGL-Versionen unterstützt. Die Liste zeigt, dass ich alle Varianten mit Ausnahme von OpenGL/ES Versionen unterstütze. QFlags() in der dritten Zeile beschreibt Formatoptionen (Alphakanal, Stencil-Puffer usw.).
Wer weiß, warum QGLWidget mit nichts> = 3.1 funktioniert? Ich bin auf Linux, habe eine Nvidia GT440, und glxinfo zeigt, dass es OpenGL 4.2.0 unterstützt. Die Treiberversion wird in der obigen Beispielausgabe gedruckt. Ich bin mir nicht sicher, was ich sonst noch versuchen sollte.
Edit: Ich machte einige ziemlich schlechte Fehler/Annahmen mit meiner Erklärung des Problems vor dieser Bearbeitung. Das Problem ist immer noch ähnlich, aber hoffentlich macht es jetzt ein bisschen mehr Sinn. Entschuldigung für jede Verwirrung.
Sind Ihre Shader kompilieren/verknüpfen? Wenn Sie einen 4.2-Kontext und inkompatible/falsche Shader verwenden, ist dies ein Grund für ein leeres Fenster. –
Ich bin noch nicht so weit (Shaders). Ich wollte QGLWidget als Ansichtsfenster für eine QDeclarativeView verwenden und dann 3D-Inhalte hinzufügen, die Shader verwenden. Aber selbst eine einfache Datei mit Standardkomponenten wie einem Rectangle {} rendert nichts.Es wird wie erwartet dargestellt, wenn ich die QGLFormat Version nicht setze, aber der ganze Punkt dieser Frage ist herauszufinden, warum ich es nicht an erster Stelle setzen kann. Außerdem würde ich Fehler bekommen, wenn ich (oder Qt intern) inkompatible Shader benutze. Die einzige Ausgabe ist, was ich in meine Frage eingefügt habe. – Prismatic
Hmm, der einzige Grund, warum ich vorschlage, das Shader-Protokoll zu betrachten, ist, dass OpenGL 3.0 + erfordert, dass Ihre eigenen Shader kompiliert und geladen werden, während OpenGL 2.0 und darunter nicht funktionieren. Ich habe keine Erfahrung mit der Verwendung von OpenGL durch QT, so weiß ich nicht, wie viel für Sie behandelt wird. In dem von Ihnen verlinkten Beispiel bereitet der Autor jedoch eigene Shader vor. Wenn Sie der Grafikkarte keine Shader mit dem Core-Profil bereitstellen, werden Sie nichts rendern. –