我正在尝试在Visual Studio的QOpenGLWidget中使用GLEW和QT。
一些细节:
调用Missing GL version
时,我一直收到“glewInit()
”错误。我在线搜索了很多,这个问题似乎有时是由格式设置方式(QSurfaceFormat
)或函数create()
/ makeCurrent()
/ {{1}使用。但我似乎无法找到一个有效的解决方案。我对整个doneCurrent()
事情仍感到有些困惑。
我设法让QOpenGLContext
在没有GLEW的情况下工作,并使用“旧”gl函数(QOpenGLWidget
,glBegin()
等...)。我也让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;
};
答案 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();
glwidget->resize(400,500);
glwidget->show();
resize
调用的事件。 initializeGL()
调用paintGL()
和show
时也是如此。
另一个是:GLenum err = glewInit();
if (GLEW_OK != err){
std::cout << "[Error] GLEW failed to initialize. " << (const char*)glewGetErrorString(err);
}
doneCurrent();
现在为什么要在这里给doneCurrent
打电话?