Can't set desired OpenGL version in QGLWidget
I'm trying to use QGLWidget in Qt 4.8.2. I noticed that the default context QGLWidget creates doesn't show any output for OpenGL above 3.1. The Qt wiki has a tutorial that demonstrates using OpenGL 3.3 to draw a simple triangle. When I try to run the tutorial, I get a blank screen. If I change the OpenGL version to 3.1, I get the expected output (a red triangle).
My video card supports OpenGL 4.2, and calling QGLFormat::openGLVersionFlags()
before creating the QGLWidget shows that Qt detects OpenGL 4.2 and all previous desktop versions.
Here's another minimal example:
#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();
}
Here's the output:
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 )
The QFlags()
enum list on the first line describes the OpenGL versions supported. The list shows I support all variants except for OpenGL/ES versions. QFlags() on the third line describes format options (alpha channel, stencil buffer, etc).
Anyone know why QGLWidget won't work with anything >= 3.1? I'm on Linux, have an Nvidia GT440, and glxinfo shows it supports OpenGL 4.2.0. The driver version is printed in the sample output above. I'm not too sure what else to try.
Edit: I made some pretty bad mistakes/assumptions with my explanation of the problem before this edit. The issue is still similar, but hopefully makes a bit more sense now. Sorry for any confusion.
You should move the OpenGL queries down after mainView.show();
. Before show()
the OpenGL context has not been initialized.
Short version: update to Qt5, it's fixed there.
PS And if you can use 5.4 you should probably use QtOpenGL... classes instead of QGL... ones.
Long version: So, in case anyone ever come across a problem like this one.
I tried to create NOT OpenGL 3.0 context with my Intel HD3000 on ubuntu 14.04 and Qt 4.8.6. I came up with this test code provided at the end of the answer. Tried creating 3.1, 1.2, 2.1.. etc. contexts Core Compatible.. but always end up with context->format().majorVersion()
showing the requested version, and glGetString(GL_VERSION)
showing 3.0.
After about 3 hours I noticed that by default Qt Creator uses Qt4 instead of recent Qt 5, installed on my system. And after I recompiled the project with Qt 5.2.1 exactly the same code started working as expected.
Hope this may help someone.
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 GLEWn");
}
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() << "endstuffn";
return a.exec();
}
链接地址: http://www.djcxy.com/p/38510.html
上一篇: OpenGL,如何设置GLSL版本?