OS X 上的 OpenGL 版本支持

OpenGL Version Support on OS X

本文关键字:版本 支持 OpenGL 上的 OS      更新时间:2023-10-16

我尝试在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 context 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 , 深度

缓冲区大小 -1 , 累积缓冲区大小 -1 , 模板缓冲区大小 -1 , 红色缓冲区大小 -1 , 绿色缓冲区大小 -1 , 蓝色缓冲区大小 -1 , alphaBufferSize -1 , 样本 -1 , 交换间隔 -1 , 主要版本 3 , 次要版本 3 , 配置文件 1 )

OpenGL 上下文 QGLFormat(选项 QFlags(0x1|0x2|0x4|0x20|0x80|0x200|0x400) , 平面 0 , 深度

缓冲区大小 1 , 累积缓冲区大小 -1 , 模板缓冲区大小 1 , 红色缓冲区大小 -1 , 绿色缓冲区大小 -1 , 蓝色缓冲区大小 -1 , alpha缓冲区大小 -1 , 样本 4 , 交换间隔 -1 , 主要版本 3 , 次要版本 3 , 配置文件 1 )

驱动程序版本字符串:0x10800e6be

尽管我不确定这个想法的确切含义,但似乎0x8000意味着首先支持 OpenGL 3.3,但由于后来的标志只是0x400版本支持在此过程中以某种方式丢失。

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

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

类似帖子无法在 QGLWidget 中设置所需的 OpenGL 版本

似乎我不是唯一一个在本教程中苦苦挣扎的人,我在这里找到了解决方案。即使提到教程的源代码也缺少绑定 VAO。

在 m_shader.setAttributeBuffer 之前的初始化 GL 中添加以下内容:

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);