已经过去了17天,我正在努力使用QT编写OpenGL的简单程序,但是在谷歌上搜索到的所有教程都失败了。
我已经使用msvc2010编译了QT 5.0.1,并使用-opengl desktop选项使桌面OpenGL成为默认选项。
我阅读了Sean Harmer的教程,但它依赖于QT来解决OpenGL函数。
根据一些人的说法,不可能在QT中使用glew,因为QT内置库会阻止glew包含其头文件,但根据Sean Harmer 这里 的说法,这是可能的(但没有说明如何实现)。
即使使用QGLWidget,我也无法使用OpenGL扩展。
现在我想要使用所有OpenGL函数和所有QT窗口函数分开,即QT不对OpenGL产生干扰。
如果有人能用简单的三角形示例和任何扩展向我解释该过程,我将不胜感激。
我在项目中使用了glew库,并在程序的起始位置#include了glew.h,但编译时出现错误:
glwidget.obj:-1: error: LNK2001: unresolved external symbol 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 报告像素格式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);
}
GLEW_STATIC
标记。假定您在拥有有效上下文后调用了glewInit()
。 - cmannett85