已经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文件
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上
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);
}
发布于 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天时间解决了这些问题,很高兴现在就可以开始实际编程了。
发布于 2013-07-02 13:58:27
下面的代码在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();
}
gltest.pro:
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,并使用扩展来绘制您想要的任何东西。我在这附近没有代码片段。
建议:
据一些人说
人们说了很多话,你不需要全信。
发布于 2020-11-19 18:26:03
我想分享一下我关于如何让Qt和glew在(目前)最新的Windows环境中协同工作的最新发现(QT5.15.1+ QMake + MSVC 2019 +GleW2.1.0)。希望其他人避免像我一样在这上面花费无数的时间.以下是我所做的:
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函数的一些链接错误。
QOpenGLWidget
而不是QGLWidget
。当我的程序退出并试图破坏析构函数中的缓冲区和纹理句柄等QGLWidget
句柄时,OpenGL引起了一些奇怪的OpenGL“无效操作”错误。glIntercept告诉我,这是因为wgl上下文在释放句柄之前就被销毁了。切换到QOpenGLWidget完全解决了这个问题。希望您现在可以享受使用glew与Qt!
https://stackoverflow.com/questions/17424487
复制相似问题