在QT中使用glew解析OpenGL函数
已经17天了我正在努力用QT在OpenGL中编写一个简单的程序,但是在Google上搜索的所有教程都失败了。 我用msvc2010编译了Qt5.0.1和-opengl桌面,使桌面成为opengl默认值 我读过肖恩·哈默的教程,但它依赖于QT来解析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扩展 现在我想要的是使用所有
根据一些人的说法,在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)上协同工作。希望其他人不要像我一样在这上面花费无数的时间。以下是我所做的:
-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