【发布时间】:2013-06-29 18:08:12
【问题描述】:
已经 17 天了 我正在努力使用 QT 在 OpenGL 中编写一个简单的程序,但是在 Google 上搜索的所有教程都失败了。 我已经使用 msvc2010 编译了带有 -opengl 桌面的 QT 5.0.1 以使桌面 opengl 成为默认值。
我读过 Sean Harmer 的教程,但它依赖于 QT 来解析 opengl 函数。
根据某些人的说法,不可能在 QT 中使用 glew,因为 QT 的内置库阻止 glew 包含其标题,但根据 Sean Harmer HERE ,这是可能的(但没有解释如何)。
即使使用 QGLWidget,我也无法使用 OpenGL 扩展。
现在我只想单独使用所有 OpenGL 函数和 QT 中的所有窗口函数,即 QT 不会干扰 OpenGL。
如果有人用简单的三角形示例并使用任何扩展名向我解释该过程,我将非常感激..
我在我的项目中使用了 glew 库,并在我的程序开始时使用了 #included glew.h,但是在编译时它给出了错误: glwidget.obj:-1:错误:LNK2001:未解析的外部符号 imp__glewGenVertexArrays
我的 .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);
}
【问题讨论】:
-
"根据某些人的说法,在 QT 中不能使用 glew" 错误。大多数在 Qt 应用程序中使用 OpenGL 的人使用 GLEW 配置扩展,并从
QGLWidgets内部调用原始 OpenGL 函数。但是如果没有具体的错误信息,你使用过的.pro文件等等,我们帮不了你。 -
错误“无法解析的外部符号 imp__glew”是在 glew32s.lib 添加静态标记时出现的,当 glew32.lib 添加动态标记时它们会消失。虽然我的程序意外终止,但在调试模式下运行时,问题出在 glDrawArrays...
-
如果您尝试在 Windows 上进行静态链接,您需要定义
GLEW_STATIC令牌。一旦你有有效的上下文,大概你也会调用glewInit()。 -
是的 Iv glewInit() 在 initialiseGL() 中。正如你所说,我在#include glew.h 之前添加了 GLEW_STATIC,但它给出了警告::-1: warning: LNK4098: defaultlib 'LIBCMT' conflict with use of other libs;使用 /NODEFAULTLIB:library glew32s.lib(glew.obj):-1: 警告:LNK4099: 在 'glew32s.lib(glew.obj)' 或'D:\Dexter\Softwares 中找不到 PDB'vc100.pdb' \Programming stuff\QT Projects\Trial-build-Desktop_Qt_5_0_1_MSVC2010_32bit-Debug\debug\vc100.pdb';链接对象好像没有调试信息
-
只是为了确定,您的 GPU 支持什么版本的 OpenGL(由
glewinfo返回)?另外,发布您的initializeGL()方法。