OS X上的OpenGL版本支持

我尝试在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(选项QFlags(0x1 | 0x2 | 0x4 | 0x20 | 0x80 | 0x200 | 0x400),plane 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上下文QGL格式(选项QFlags(0x1 | 0x2 | 0x4 | 0x20 | 0x80 | 0x200 | 0x400),平面0,depthBufferSize 1,accumBufferSize -1,stencilBufferSize 1,redBufferSize -1,greenBufferSize -1,blueBufferSize -1,alphaBufferSize -1 ,样本4,swapInterval -1,majorVersion 3,minorVersion 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之前的initializeGL中:

    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);
    
    链接地址: http://www.djcxy.com/p/6553.html

    上一篇: OpenGL Version Support on OS X

    下一篇: 3 headers(C/C++) in linux (with nvidia driver)