2013-11-14 174 views
1

我嘗試使用現代管道實現的方式在OS X 10.9上用Qt(v5.1.1)編寫OpenGL項目。但是,我遇到一些問題,例如從教程中重建程序。 http://qt-project.org/wiki/How_to_use_OpenGL_Core_Profile_with_QtOpenGL版本在OS X上的支持

簡單的三角形不顯示,但沒有警告,程序本身出現。我懷疑我的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中| 0×10 |爲0x20 | 0x40的|×1000 |爲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,簡檔1)

OpenGL上下文QGLFormat(選項QFlags(爲0x1 | 0X2 |爲0x4 |爲0x20 | 0x80的|爲0x200 | 0x400的),平面0,depthBufferSize 1,accumBufferSize -1,stencilBufferSize 1,redBufferSize -1, greenBuff erSize -1,-1 blueBufferSize,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下,這些配置?
  • 如果是這樣,是否有可能升級一些庫或圖形驅動程序?
  • 在不支持相同的計算機上啓動時,使用核心配置文件的應用程序會發生什麼情況?

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

+0

C++ I/O流讓我很煩。我非常肯定,您爲版本字符串打印的值是字符串指向的地址,而不是實際的字符串。您可能需要將其轉換爲'(const char *)'或創建一個'std :: string'。 –

+0

只需在終端輸入'glxinfo',它就會告訴你你的驅動支持什麼。 – cmannett85

+0

@ cmannett85:這裏的問題不是支持哪個版本,而是他實際得到的是什麼版本。默認情況下,OS X將爲您提供OpenGL 2.1上下文,除非您使用適當的像素格式標誌來獲取3.2核心上下文。 –

回答

3

看來我是不是唯一一個與此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); 
+1

由於Qt 5.1存在VAO的包裝: http://qt-project.org/doc/qt- 5.1/qtgui/qopenglvertexarrayobject.html – cguenther