3

私は Qt5 を使用して OpenGL コンテキストを提供しようとしていますが、それはそうであると信じていますが、initializeGL 関数内から glewInit() を呼び出そうとすると、エラーが「Missing GL version」を返します。信じることは、有効なコンテキストがないことを示します。私が見た解決策は、 initializeGL 内から glewInit() を呼び出すことでした...しかし、私はすでにそれを行っています。

クリアカラーを設定し、クリアをダークレッドに設定して、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 );
}
4

1 に答える 1

0

これは、QGLWidget のデフォルトの QGLFormat が OpenGL バージョン 1.0 を使用していることが原因であることがわかりました (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);
于 2013-03-10T05:36:41.610 に答える