使用GLEW和QOpenGLWidget

时间:2017-10-08 12:57:02

标签: qt opengl glew

我正在尝试在Visual Studio的QOpenGLWidget中使用GLEW和QT。

一些细节:

  • Visual Studio 2013
  • Glew 2.0.0 x64
  • QT 5.6.2 x64

调用Missing GL version时,我一直收到“glewInit()”错误。我在线搜索了很多,这个问题似乎有时是由格式设置方式(QSurfaceFormat)或函数create() / makeCurrent() / {{1}使用。但我似乎无法找到一个有效的解决方案。我对整个doneCurrent()事情仍感到有些困惑。

我设法让QOpenGLContext在没有GLEW的情况下工作,并使用“旧”gl函数(QOpenGLWidgetglBegin()等...)。我也让GLEW与GLFW3合作。

在下面的代码中,我似乎有什么误解吗?

我的QOpenGLWidget的子类

MyGLWidget.h

glEnd()

MyGLWidget.cpp

#pragma once
#include <QWidget>
#include "GL\glew.h"
#include <QOpenGLWidget>
#include <gl/GLU.h>
#include <gl/GL.h>
#include <iostream>
#include "qopenglcontext.h"
#include "loadShader.h"

class MyGLWidget : public QOpenGLWidget
{
public:
   MyGLWidget(QWidget *parent = 0);
   ~MyGLWidget();

public:
   void initializeGL() override;
   void resizeGL(int w, int h) override;
   void paintGL() override;
};

的main.cpp

#include "MyGLWidget.h"

MyGLWidget::MyGLWidget(QWidget *parent)
   : QOpenGLWidget(parent)
{

   QSurfaceFormat glformat;
   glformat.setVersion(3, 2);
   glformat.setOption(QSurfaceFormat::DeprecatedFunctions);
   glformat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
   glformat.setProfile(QSurfaceFormat::CompatibilityProfile);
   QSurfaceFormat::setDefaultFormat(glformat);
   this->setFormat(glformat);

   create();
   makeCurrent();
}

MyGLWidget::~MyGLWidget(){}

void MyGLWidget::initializeGL()
{
   glewExperimental = TRUE;
   GLenum err = glewInit();
   if (GLEW_OK != err){
      std::cout << "[Error] GLEW failed to initialize. " << (const char*)glewGetErrorString(err);
   }
   doneCurrent();

   GLuint TextShader_ID = LoadShaders("Shaders/TextVertShader.vert", "Shaders/TextFragShader.frag");

}

void MyGLWidget::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void MyGLWidget::resizeGL(int w, int h)
{
   //...
}

OGLQT_test2.h

#include "OGLQT_test2.h"
#include <QtWidgets/QApplication>
#include "GL\glew.h"
#include <QOpenGLFunctions>

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

    w.show();
    return a.exec();
}

OGLQT_test2.cpp

#pragma once
#include "GL\glew.h"
#include <QtWidgets/QMainWindow>
#include "ui_OGLQT_test2.h"
#include "qopenglcontext.h"

class OGLQT_test2 : public QMainWindow
{
    Q_OBJECT

public:
    OGLQT_test2(QWidget *parent = Q_NULLPTR);

private:
    Ui::OGLQT_test2Class ui;
};

1 个答案:

答案 0 :(得分:1)

您似乎无法做到这一点:

glformat.setVersion(x, y);

使用GLEW。它可以与QOpenGLFunctions一起使用,但是显然,它不适用于GLEW。您可能也无法执行此操作,

glformat.setOption(QSurfaceFormat::DeprecatedFunctions);
glformat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
glformat.setProfile(QSurfaceFormat::CompatibilityProfile);

尝试删除格式。

此外,我认为您在这里有些混乱:

glwidget->initializeGL();
glwidget->resizeGL(400,500);
glwidget->paintGL();
  1. 有一个简单的方法可以做到这一点,只需执行以下操作即可:
glwidget->resize(400,500);
glwidget->show();
  1. resizeGL是resize调用的事件initializeGL()调用paintGL()show时也是如此。 另一个是:
GLenum err = glewInit();
if (GLEW_OK != err){
   std::cout << "[Error] GLEW failed to initialize. " << (const char*)glewGetErrorString(err);
}
doneCurrent();

现在为什么要在这里给doneCurrent打电话?