无法在QGLWidget中设置所需的OpenGL版本
我试图在Qt 4.8.2中使用QGLWidget。 我注意到QGLWidget创建的默认上下文不会显示任何3.1以上的OpenGL输出。 Qt wiki有一个教程,演示如何使用OpenGL 3.3绘制一个简单的三角形。 当我尝试运行教程时,我得到一个空白屏幕。 如果我将OpenGL版本更改为3.1,我会得到预期的输出(一个红色三角形)。
我的视频卡支持OpenGL 4.2,并在创建QGLWidget之前调用QGLFormat::openGLVersionFlags()
,这表明Qt检测到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版本之外的所有变体。 第三行的QFlags()描述了格式选项(alpha通道,模板缓冲区等)。
任何人都知道为什么QGLWidget不能用于任何> = 3.1的工作? 我在Linux上,有一个Nvidia GT440,glxinfo显示它支持OpenGL 4.2.0。 驱动程序版本打印在上面的示例输出中。 我不太确定还有什么要尝试的。
编辑:我做了一些非常糟糕的错误/假设与我编辑前的问题的解释。 这个问题仍然类似,但希望现在更有意义。 对不起,有任何困惑。
你应该在mainView.show();
之后向下移动OpenGL查询mainView.show();
。 在show()
之前,OpenGL上下文尚未初始化。
简短版本:更新到Qt5,它在那里修复。
PS如果你可以使用5.4,你应该使用QtOpenGL ...类而不是QGL ...类。
长版:所以,如果有人遇到像这样的问题。
我尝试在ubuntu 14.04和Qt 4.8.6上使用我的英特尔HD3000创建非OpenGL 3.0环境。 我想出了答案末尾提供的这个测试代码。 尝试创建3.1,1.2,2.1 ..等上下文Core Compatible ..但总是以context->format().majorVersion()
显示请求的版本, glGetString(GL_VERSION)
显示3.0。
大约3个小时后,我注意到,默认情况下,Qt Creator使用Qt4,而不是最近的Qt 5,安装在我的系统上。 在我用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 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/38509.html
上一篇: Can't set desired OpenGL version in QGLWidget
下一篇: Starting to learn OpenGL. On modern Linux, how are all these concepts related?