我正在尝试在 Qt 4.8.2 中使用 QGLWidget。我注意到 QGLWidget 创建的默认上下文不显示 3.1 以上 OpenGL 的任何输出。Qt wiki 有一个教程,演示了使用 OpenGL 3.3 绘制一个简单的三角形。当我尝试运行教程时,我得到一个空白屏幕。如果我将 OpenGL 版本更改为 3.1,我会得到预期的输出(红色三角形)。
我的显卡支持 OpenGL 4.2,QGLFormat::openGLVersionFlags()
在创建 QGLWidget 之前调用显示 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。驱动程序版本打印在上面的示例输出中。我不太确定还能尝试什么。
编辑:在此编辑之前,我对问题的解释犯了一些非常糟糕的错误/假设。这个问题仍然相似,但希望现在更有意义。很抱歉有任何混淆。