首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QT中使用glew解析OpenGL函数

QT中使用glew解析OpenGL函数
EN

Stack Overflow用户
提问于 2013-07-02 11:32:33
回答 3查看 12.5K关注 0票数 8

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

我读过Sean的教程,但它是依靠QT来解决opengl函数的。

据一些人说,在QT中使用glew是不可能的,因为QT的内置库阻止了glew包含它的头部,但是Sean 这里认为这是可能的(但是这里没有解释它是如何实现的)。

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

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

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

我在我的项目中使用了glew库,在我的程序刚开始时就包含了#included w.h,但是在编译时它会产生错误: glwidget.obj:-1: LNK2001: LNK2001:未解决的外部符号LNK2001

我的.pro文件

代码语言:javascript
运行
复制
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的输出:GLEW1.9.0版像素格式1的报告功能,运行在NVIDIA 4.3.0版的GeForce GT 540 M/PCIe/SSE2 2上

代码语言:javascript
运行
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-03 06:12:08

所有问题都解决了。

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

第二个问题是在项目中添加glew库。如果您添加了glew32s.lib (静态),那么您必须在“# GLEW_STATIC”之前添加"#define GLEW_STATIC“,建议您使用glw32.lib(动态)。

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

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

票数 17
EN

Stack Overflow用户

发布于 2013-07-02 13:58:27

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

main.cpp:

代码语言:javascript
运行
复制
#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();
}

gltest.pro:

代码语言:javascript
运行
复制
TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += . d:/c++/libs/include
LIBS += -L"d:/c++/libs/lib" -lglew32

CONFIG += console
QT += opengl

# Input
SOURCES += main.cpp

我假设Qt 5的情况不会有任何不同。

可以随意重写QGLWidget的paintGL,并使用扩展来绘制您想要的任何东西。我在这附近没有代码片段。

建议:

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

据一些人说

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

票数 4
EN

Stack Overflow用户

发布于 2020-11-19 18:26:03

我想分享一下我关于如何让Qt和glew在(目前)最新的Windows环境中协同工作的最新发现(QT5.15.1+ QMake + MSVC 2019 +GleW2.1.0)。希望其他人避免像我一样在这上面花费无数的时间.以下是我所做的:

  1. 将glw32.dll和glw32.lib复制到项目目录中的某个位置。确保glew的bitness与您让Qt构建的可执行文件的bitness匹配。我没有使用这个库的静态版本,因为我没能做到这一点。
  2. 在您的.pro (QMake)文件中,编写如下内容:
代码语言:javascript
运行
复制
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

与前面的答案相比,我唯一的不同之处是,我在链接参数中添加了-lglu32-lopengl32。看来它们在Windows上是强制性的,当然MSVC会抱怨OpenGL API函数的一些链接错误。

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

希望您现在可以享受使用glew与Qt!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17424487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档