OS X 上的 OpenGL 版本支持

Posted

技术标签:

【中文标题】OS X 上的 OpenGL 版本支持【英文标题】:OpenGL Version Support on OS X 【发布时间】:2013-11-14 23:13:42 【问题描述】:

我尝试以现代管道实现的方式在 OS X 10.9 上使用 Qt (v5.1.1) 编写 OpenGL 项目。但是,我遇到了一些从教程重建程序的问题,例如 http://qt-project.org/wiki/How_to_use_OpenGL_Core_Profile_with_Qt

简单的三角形没有出现,但是没有警告并且程序本身出现了。我怀疑我的 mac 可能不支持 GLSL。所以我寻找了一种打印一些信息的方法。我发现有类似问题的人这样做了。

#include <QApplication>
#include <QGLFormat>
#include "glwidget.h"

int main(int argc, char* argv[])

    QApplication mApplication(argc, argv);

    QGLFormat mGlFormat;
    mGlFormat.setVersion(3, 3);
    mGlFormat.setProfile(QGLFormat::CoreProfile);
    mGlFormat.setSampleBuffers(true);

    qDebug() << "OpenGL context QFlags " << mGlFormat.openGLVersionFlags();
    qDebug() << "OpenGL context " << mGlFormat;

    GLWidget mWidget(mGlFormat);
    mWidget.show();

    qDebug() << "OpenGL context" << mWidget.format();
    qDebug() << "Driver Version String:" << glGetString(GL_VERSION);

    return mApplication.exec();

结果我得到了。

OpenGL 上下文 QFlags QFlags(0x1|0x2|0x4|0x8|0x10|0x20|0x40|0x1000|0x2000|0x4000|0x8000)

OpenGL 上下文 QGLFormat(options QFlags(0x1|0x2|0x4|0x20|0x80|0x200|0x400) , 平面 0 , depthBufferSize -1 , accumBufferSize -1 , stencilBufferSize -1 , redBufferSize -1 , greenBufferSize -1 , blueBufferSize - 1 , alphaBufferSize -1 , samples -1 , swapInterval -1 , majorVersion 3 , minorVersion 3 , profile 1 )

OpenGL 上下文 QGLFormat(options QFlags(0x1|0x2|0x4|0x20|0x80|0x200|0x400) , 平面 0 , depthBufferSize 1 , accumBufferSize -1 , stencilBufferSize 1 , redBufferSize -1 , greenBufferSize -1 , blueBufferSize -1 , alphaBufferSize -1 , samples 4 , swapInterval -1 , majorVersion 3 , minorVersion 3 , profile 1 )

驱动版本字符串:0x10800e6be

尽管我不确定这个的确切含义,但从这个想法的来源所写的内容来看,似乎 0x8000 意味着首先支持 OpenGL 3.3,但由于后来的标志只有 0x400 版本支持不知何故迷路了。

我的显卡是 NVIDIA GeForce 9400M 256 MB,应该支持 OpenGL 3.3。 https://developer.apple.com/graphicsimaging/opengl/capabilities/

这是否意味着我无法在这些配置下使用 GLSL? 如果可以,是否可以升级某些库或图形驱动程序? 使用核心配置文件的应用程序在不支持该配置文件的计算机上启动时会发生什么情况?

类似的帖子 Can't set desired OpenGL version in QGLWidget

【问题讨论】:

C++ 流 I/O 让我很恼火。我很确定您为版本字符串打印的值是字符串指向的地址,而不是实际字符串。您可能需要将其转换为 (const char*) 或创建一个 std::string 只要在终端输入glxinfo,它就会告诉你你的驱动支持什么。 @cmannett85:这里的问题不是支持什么版本,而是他实际得到的是什么版本。默认情况下,OS X 会为您提供 OpenGL 2.1 上下文,除非您使用适当的像素格式标志来获取 3.2 核心上下文。 @Andon M. Coleman:是的,我现在明白了Driver Version String: 3.3 NVIDIA-8.18.27 310.40.05f01 啊,那很好。在这种情况下,您有一个 3.3 上下文。您的问题一定是由于着色器的实现,但绝对与您的 GL 版本无关。 【参考方案1】:

看来我不是唯一一个与tutorial 苦苦挣扎的人,我找到了解决方案here。即使提到了绑定 VAO 的教程的源代码。

在initializeGL中添加这个在m_shader.setAttributeBuffer之前:

uint vao;

typedef void (APIENTRY *_glGenVertexArrays) (GLsizei, GLuint*);
typedef void (APIENTRY *_glBindVertexArray) (GLuint);

_glGenVertexArrays glGenVertexArrays;
_glBindVertexArray glBindVertexArray;

glGenVertexArrays = (_glGenVertexArrays) QGLWidget::context()->getProcAddress("glGenVertexArrays");
glBindVertexArray = (_glBindVertexArray) QGLWidget::context()->getProcAddress("glBindVertexArray");

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

【讨论】:

自 Qt 5.1 以来,存在一个用于 VAO 的包装器:qt-project.org/doc/qt-5.1/qtgui/qopenglvertexarrayobject.html

以上是关于OS X 上的 OpenGL 版本支持的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 上的 Qt 4.8.6 中更改 QGLWidgets 的 OpenGL 上下文版本

Qt & OpenGL OS X:山狮上的 GLSL 着色器版本只有 120

在 OS X 上的 pyglet 中启用 OpenGL 核心配置文件

Mac OS X 上的 OpenGL 纹理损坏

当动态图形设备切换处于活动状态时,OS X 上的 SDL/OpenGL 出现无数警告

如何在 OS X 上初始化 QOpenGLContext 以使用 OpenGL 3.3 版?