我想用Qt 4.8.6用QGLWidget渲染OpenGL内容。我正在研究的机器是OS X 10.9.4的macbook pro。
通过传递具有3.2核心配置文件的请求格式版本的QGLFormat对象来创建QGLWidget。我遇到的问题是,无论我指定什么GLFormat,QGLContext报告的OpenGL版本仍为1.0。
在研究该主题后,我找到了Qt OpenGL Core Profile Tutorial。但是,示例源代码报告了之前的相同OpenGL版本1.0。奇怪的是电话
qDebug() << "Widget OpenGl: " << format().majorVersion() << "." << format().minorVersion();
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);
报告版本字符串为2.1
Widget OpenGl: 1 . 0
Context valid: true
Really used OpenGl: 1 . 0
OpenGl information: VENDOR: NVIDIA Corporation
RENDERDER: NVIDIA GeForce GT 750M OpenGL Engine
VERSION: 2.1 NVIDIA-8.26.26 310.40.45f01
GLSL VERSION: 1.20
使用2011年 this OS X opengl context discussion中建议的Cocoa代码,版本号的输出更改为
Widget OpenGl: 1 . 0
Context valid: true
Really used OpenGl: 1 . 0
OpenGl information: VENDOR: NVIDIA Corporation
RENDERDER: NVIDIA GeForce GT 750M OpenGL Engine
VERSION: 4.1 NVIDIA-8.26.26 310.40.45f01
GLSL VERSION: 4.10
虽然驱动程序现在报告预期的OpenGL版本号,但我仍然只能获得1.0 QGLWidget上下文。传递给QGLWidget构造函数的QGLFormat对象是使用
设置的QGLFormat fmt;
fmt.setProfile(QGLFormat::CoreProfile);
fmt.setVersion(3, 2);
fmt.setSampleBuffers(true);
我有点不知道为什么我仍然只获得1.0版本的上下文。即使没有Cocoa框架生成OpenGL Context,也应该可以将上下文版本增加到2.1,但无论传递给构造函数的QGLFormat如何,它都会保持固定为1.0。
非常感谢任何有关QGLWidget上下文保持在1.0版本的指示。
进一步的实验表明代码在Ubuntu 13.04 Linux上返回所请求的OpenGL版本。这个问题似乎是针对OS X的。
我构建了一个最小的非工作示例
#include <QtOpenGL/QGLFormat>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QApplication>
#include <QtCore/QDebug>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QGLFormat fmt = QGLFormat::defaultFormat();
fmt.setVersion(3,2);
fmt.setProfile(QGLFormat::CoreProfile);
fmt.setSampleBuffers(true);
QGLWidget c(fmt);
c.show();
qDebug() << c.context()->requestedFormat();
qDebug() << c.context()->format();
return app.exec();
}
可以使用
在Ubuntu中构建g++ main.cpp -I/usr/include/qt4 -lQtGui -lQtCore -lQtOpenGL -lGL -o test
或OS X
g++ main.cpp -framework OpenGL -framework QtGui -framework QtCore -framework QtOpenGL -o test
它打印两行QGLFormat调试输出。第一行是请求的格式,第二行是实际的上下文格式。两者都应该显示3.2的主要版本号。它似乎在Ubuntu Linux下工作,但在使用OS X时失败。
有趣的时光。它可能是Qt4.8.6中的一个错误,因为在Qt5.3.1再次编译示例时不会出现问题。一个bug report has been filed.
其他人可以验证此行为吗?
答案 0 :(得分:0)
是。那是特定的平台。请找到解决方案here。
覆盖QGLContex :: chooseMacVisual以指定特定于平台的初始化。
CustomGLContext.hpp:
#ifdef Q_WS_MAC
void* select_3_2_mac_visual(GDHandle handle);
#endif // Q_WS_MAC
class CustomGLContext : public QGlContext {
...
#ifdef Q_WS_MAC
void* chooseMacVisual(GDHandle handle) override {
return select_3_2_mac_visual(handle); // call cocoa code
}
#endif // Q_WS_MAC
};
gl_mac_specific.mm:
void* select_3_2_mac_visual(GDHandle handle)
{
static const int Max = 40;
NSOpenGLPixelFormatAttribute attribs[Max];
int cnt = 0;
attribs[cnt++] = NSOpenGLPFAOpenGLProfile;
attribs[cnt++] = NSOpenGLProfileVersion3_2Core;
attribs[cnt++] = NSOpenGLPFADoubleBuffer;
attribs[cnt++] = NSOpenGLPFADepthSize;
attribs[cnt++] = (NSOpenGLPixelFormatAttribute)16;
attribs[cnt] = 0;
Q_ASSERT(cnt < Max);
return [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
}