2013-03-09 72 views
3

我一直在尝试使用Qt5给我一个OpenGL上下文,我相信它的确如此,但是当我尝试从initializeGL函数内调用glewInit()时,错误返回“缺少GL版本“,我被引导认为表明没有有效的上下文。我看到的解决方案是从initializeGL中调用glewInit(),但我已经这样做了。glewInit与Qt5返回缺少GL版本

我正在设置清晰的颜色并清除为暗红色,以验证gl呼叫是否正常工作,它们看起来像是。

有什么建议吗?

的main.c

#define QT_NO_OPENGL_ES_2 
#include <QApplication> 
#include "glwidget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    GLWidget w; 
    w.show(); 

    return a.exec(); 
} 

glwidget.h

#ifndef GLWIDGET_H 
#define GLWIDGET_H 

#include <GL/glew.h> 
#define QT_NO_OPENGL_ES_2 
#include <QGLWidget> 

class GLWidget : public QGLWidget 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QGLWidget *parent = 0); 
    ~GLWidget(); 

    QSize minimumSizeHint() const; 
    QSize sizeHint() const; 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 
}; 

#endif // GLWIDGET_H 

glwidget.cpp

#include "glwidget.h" 

GLWidget::GLWidget(QGLWidget *parent) : 
    QGLWidget(parent) 
{ 
} 

GLWidget::~GLWidget() {} 

QSize GLWidget::minimumSizeHint() const { 
    return QSize(640, 480); 
} 

QSize GLWidget::sizeHint() const { 
    return QSize(800, 600); 
} 

void GLWidget::initializeGL() { 
    GLenum err = glewInit(); 
    if (GLEW_OK != err) { 
     printf("GLEW error: %s\n", glewGetErrorString(err)); 
    } else { 
     printf("Glew loaded; using version %s\n", glewGetString(GLEW_VERSION)); 
    } 

    glClearColor(0.2f, 0, 0, 1.0f); 
} 

void GLWidget::resizeGL(int w, int h) { 
} 

void GLWidget::paintGL() { 
    glClear(GL_COLOR_BUFFER_BIT); 
} 
+0

什么,当你调试到'glewInit'调用发生?它在哪里出错?另外,你使用核心OpenGL? – 2013-03-10 01:14:29

+0

有没有找到答案呢? – jcoffland 2017-02-03 01:18:49

+0

@jcoffland对不起,我从来没有这样做过,于是我转向该项目的非Qt解决方案(当时我认为SDL)。 – AberrantWolf 2017-02-03 05:13:53

回答

0

东西告诉我,THI s是因为QGLWidget使用OpenGL版本1.0的默认QGLFormat(查看GLEW的更改日志,似乎他们声称完全支持的最早版本是1.5)。尝试改为重写需要QGLFormat的QGLWidget构造函数,并将其传递给使用您所定位版本的QGLFormat实例。

你的插件的调用应该是这个样子:

QGLFormat format; 
format.setVersion(3,3); // or whatever version you are targeting. 
format.setDoubleBuffer(true); 

GLWidget * widget = new GLWidget(format); 
+0

因此,我改变构造这样: 'GLWidget :: GLWidget(QGLFormat楼QGLWidget来绘图*亲本): \t QGLWidget来绘图(父) { \t这 - > setFormat(F); }' 并按照您建议的实例化对象,但得到了相同的结果。 – AberrantWolf 2013-03-12 07:43:56