我们正在将项目从Qt 4.8迁移到5.4。我们在多线程中使用多个上下文。我们为此目的使用GLEW MX(我们创建当前需要的上下文然后在GLEWContextStruct的本地实例上调用glewInit())。
我试图将QGLWidget和QGLContext更改为QOpenGLWidget和QOpenGLContext但我最终无法初始化glew。 GLEW不会返回错误但glGetError()会返回错误。
我确实使用OpenGL版本安装了Qt 5.4 64.
以下代码减少到最低限度:
#include <QtWidgets/QApplication>
#define GLEW_MX
#define GLEW_STATIC
#include <GL/glew.h>
#include <qopenglcontext.h>
#include <qwindow.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
bool errQt;
int errGlew;
GLenum errorGL;
QSurfaceFormat requestedFormat;
requestedFormat.setVersion(3, 3);
requestedFormat.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
//Creates the QGLWidget using the current context:
QWindow window;
window.setSurfaceType(QSurface::OpenGLSurface);
window.setFormat(requestedFormat);
window.create();
//Create context
QOpenGLContext context;
context.setFormat(requestedFormat);
errQt = context.create(); //true
//Bind context
context.makeCurrent(&window);
//Glew context creation
GLEWContext* pCtx = new GLEWContext; //All forwards undefined
//Release context
context.doneCurrent();
return 1;
}
有什么建议吗? Qt5.4的GLEW是否正常?
编辑1:
看来问题与Qt无关。创建的GLEWContext没有定义任何函数(所有函数指针都是未定义的)。该代码已更新,以帮助审稿人不会失去焦点。
答案 0 :(得分:0)
我在我的项目中使用了Qt 5.4的glewInit(),但是我使用QWindow作为我的基类,而不是QOpenGLWidget。
在我的照片中,我这样做:
QRiftWindow::QRiftWindow() {
setSurfaceType(QSurface::OpenGLSurface);
QSurfaceFormat format;
format.setDepthBufferSize(16);
format.setStencilBufferSize(8);
format.setVersion(4, 3);
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
setFormat(format);
m_context = new QOpenGLContext;
m_context->setFormat(format);
m_context->create();
...
我在一个单独的线程上执行我的OpenGL工作。一旦线程启动,我就在我的课程上调用一个设置方法
m_context->makeCurrent(this);
glewExperimental = true;
glewInit();
glGetError();
我之前使用OpenGL 3.3进行了完全相同的设置并且没有任何问题。
答案 1 :(得分:0)
你实际上应该收到警告:
#warning qopenglfunctions.h与GLEW不兼容,GLEW定义将是未定义的
#warning要在Qt中使用GLEW,请不要包含或在glew.h之后
你的&#34; qopenglcontext.h&#34;包括。要回答你的问题,你可以使用Qt + GLEW,但你不能轻易地将Qt-opengl与GLEW混淆。