在QT中使用glew解析OpenGL函数

在QT中使用glew解析OpenGL函数,qt,opengl,glew,Qt,Opengl,Glew,已经17天了我正在努力用QT在OpenGL中编写一个简单的程序,但是在Google上搜索的所有教程都失败了。 我用msvc2010编译了Qt5.0.1和-opengl桌面,使桌面成为opengl默认值 我读过肖恩·哈默的教程,但它依赖于QT来解析opengl函数 根据一些人的说法,在QT中使用glew是不可能的,因为QT的内置库阻止glew包含它的头,但根据Sean Harmer的说法,这是可能的(但没有解释如何) 即使使用QGLWidget,我也不能使用OpenGL扩展 现在我想要的是使用所有

已经17天了我正在努力用QT在OpenGL中编写一个简单的程序,但是在Google上搜索的所有教程都失败了。 我用msvc2010编译了Qt5.0.1和-opengl桌面,使桌面成为opengl默认值

我读过肖恩·哈默的教程,但它依赖于QT来解析opengl函数


根据一些人的说法,在QT中使用glew是不可能的,因为QT的内置库阻止glew包含它的头,但根据Sean Harmer的说法,这是可能的(但没有解释如何)

即使使用QGLWidget,我也不能使用OpenGL扩展

现在我想要的是使用所有OpenGL函数分离和所有QT窗口函数分离,即QT不会干扰OpenGL

如果有人用简单的三角形例子和任何扩展来解释这个过程,我将非常感激

我在我的项目中使用了glew库,并且在我的程序的一开始就包含了glew.h,但编译时会出现错误: glwidget.obj:-1:错误:LNK2001:未解析的外部符号

我的.pro文件

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Trial
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp \
    glwidget.cpp

HEADERS  += mainwindow.h \
    glwidget.h

FORMS    += mainwindow.ui

RESOURCES += \
    resources.qrc
win32: LIBS += -L$$PWD/../../../../../OpenGL/glew-1.9.0/lib/ -lglew32s

INCLUDEPATH += $$PWD/../../../../../OpenGL/glew-1.9.0/include
DEPENDPATH += $$PWD/../../../../../OpenGL/glew-1.9.0/include

win32: PRE_TARGETDEPS += $$PWD/../../../../../OpenGL/glew-1.9.0/lib/glew32s.lib
glewInfo的输出: GLEW版本1.9.0 pixelformat 1的报告功能 在NVIDIA Corporation的GeForce GT 540M/PCIe/SSE2上运行 支持OpenGL 4.3.0版

void GLWidget::initializeGL()
{
    GLenum err = glewInit();
    if(err != GLEW_OK)
    {
        printf("%s",glewGetErrorString(err));
    }

    glEnable(GL_DEPTH_TEST);
    qglClearColor(QColor(Qt::red));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();
    shaderProgram.bind();

    const GLubyte *oglVersion = glGetString(GL_VERSION);
    printf( "%s\n",oglVersion );

    GLfloat vertices[3][3] ={{ -0.5, -0.5, -1 },
                { 0,    0.5,    -1},
                    { 0.5,  -0.5,   -1}};
    vertexArray.create();
    vertexArray.setUsagePattern(QOpenGLBuffer::StaticDraw);
    vertexArray.allocate( vertices, 3 * 3 * sizeof( GLfloat ) );
    vertexArray.bind();
    shaderProgram.setAttributeBuffer( "vVertex", GL_FLOAT, 0, 3 );
    shaderProgram.enableAttributeArray( "vVertex" );

    GLuint arr[5];
    glGenBuffers(5,arr);
}

以下代码在MSVC2008 express、qt 4.8.1和glew 1.7.0版上编译得很好

main.cpp:

#include <GL/glew.h>
#include <QApplication>
#include <QGLWidget>

int main(int argc, char** argv){
    glewInit();//<<-- glew function
    QApplication app(argc, argv);
    QGLWidget widget;

    GLuint arr;
    glGenVertexArrays(1, &arr);//<--no linker error (added just for testing, most likely won't gen arrays)

    widget.show();
    return app.exec();
}
我认为Qt5的情况不会有任何不同

您可以随意覆盖QGLWidget的paintGL,并使用扩展绘制您想要的任何内容。我附近没有这方面的代码片段

建议:
1.使用预编译的二进制文件。
2.使用动态链接版本的glew可能有意义。
3.注意标题包含顺序

据一些人说


人们说了很多话,你不需要全部相信。

所有问题现在都解决了

第一个问题是:Qt5.0.1默认情况下不支持opengl。 你必须用opengl桌面编译它。 是关于如何使用vs2010编译QT的教程。 或者您可以从QT下载新的opengl构建

将glew库添加到项目中的第二个问题。 如果添加glew32s.lib(static),则必须在“#include”之前添加“#define GLEW_static” 建议使用glew32.lib(动态)

第三个问题是,即使您的GPU支持版本4.3,某些opengl函数也存在段错误。 GLEW从图形驱动程序获取有关受支持扩展的信息。但是,实验或预发布驱动程序可能不会通过标准机制报告所有可用的扩展,在这种情况下,GLEW将报告它不受支持。为了避免这种情况,可以通过在调用glewInit()之前将其设置为GL_TRUE来打开glewExperimental全局开关,从而确保所有具有有效入口点的扩展都将被公开


花了18天时间解决了这些问题,现在很高兴能够开始实际编程。

我想分享我的最新发现,关于如何让Qt和glew在(当前)最新的Windows环境(Qt 5.15.1+QMake+MSVC 2019+glew 2.1.0)上协同工作。希望其他人不要像我一样在这上面花费无数的时间。以下是我所做的:

  • 将glew32.dll和glew32.lib复制到项目目录中的某个位置。确保glew的位与您告诉Qt构建的可执行文件的位匹配。我没有使用库的静态版本,因为我无法使其正常工作
  • 在.pro(QMake)文件中,编写如下内容:
  • 与前面的答案相比,我所做的唯一区别是在链接参数中添加了
    -lglu32
    -lopengl32
    。似乎它们在Windows上是强制性的,否则MSVC会抱怨OpenGL API函数的一些链接错误

  • 此外,尝试使用
    QOpenGLWidget
    而不是
    QGLWidget
    <代码>QGLWidget在我的程序退出并试图销毁OpenGL句柄(如析构函数中的缓冲区和纹理句柄)时,导致了一些奇怪的OpenGL“无效操作”错误。glIntercept告诉我这是因为wgl上下文在释放句柄之前就被破坏了。切换到QOpenGLWidget完全解决了这个问题

  • 希望您现在可以享受使用Qt的glew

    根据一些人的说法,在QT中使用glew是不可能的。大多数在Qt应用程序中使用OpenGL的人使用GLEW配置扩展,并从
    QGLWidgets
    内部调用原始OpenGL函数。但是如果没有特定的错误消息,您使用的
    .pro
    文件等。我们无法帮助您。错误“未解析的外部符号imp_uglew”在添加带有静态标记的glew32s.lib时出现,在添加带有动态标记的glew32.lib时消失。虽然我的程序在调试模式下运行时意外终止,但问题在于glDrawArrays…如果您试图在Windows上进行静态链接,则需要定义
    GLEW_static
    标记。假设您拥有有效的上下文后也在调用
    glewInit()
    。正如您所说,我在前面添加了GLEW#u STATIC,包括GLEW.h,但它给出了警告:-1:警告:LNK4098:defaultlib'LIBCMT'与其他lib的使用冲突;use/NODEFAULTLIB:library glew32s.lib(glew.obj):-1:警告:LNK4099:PDB'vc100.PDB'与'glew32s.lib(glew.obj)'一起或在'D:\Dexter\Softwares\Programming stuff\QT Projects\试用版-Desktop_QT_5_0_1_MSVC2010_32bit-Debug\Debug\vc100.PDB'处找不到;将对象链接为好像没有调试信息只是为了确保您的GPU支持哪个版本的OpenGL(由
    glewinfo
    返回)?另外,发布您的
    initializeGL()
    方法。
    TEMPLATE = app
    TARGET = 
    DEPENDPATH += .
    INCLUDEPATH += . d:/c++/libs/include
    LIBS += -L"d:/c++/libs/lib" -lglew32
    
    CONFIG += console
    QT += opengl
    
    # Input
    SOURCES += main.cpp
    
    GLEW_INCLUDE_PATH = "$$PWD/ext/glew/include" # put glew headers here
    GLEW_LIB_PATH = "$$PWD/ext/glew/x64"         # put glew32.dll and glew32.lib here
    
    LIBS += -L$$GLEW_LIB_PATH -lglew32 -lglu32 -lopengl32
    
    DEPENDPATH += .
    INCLUDEPATH += $$GLEW_INCLUDE_PATH