QT+OpenGL学习之路

转自http://www.cnblogs.com/tornadomeet/archive/2012/08/22/2651574.html

很早就想学opengl的,一直没时间,今天心血来潮初步了解了下opengl。

Opengl是对2D和3D图形支持很好,有非常多的优化函数,因为opengl的主要目标是图形功能函数上,所以它对图形界面的支持并不完善。当然了,作为一个跨平台的开源库,这是能理解的,因为每个平台开发界面用的工具不同,如果它只支持其一,那么私心也太重了,还不如节省精力放在核心的代码上。

Qt的UI函数很多,它的Opengl封装很好,将opengl的函数和Qt的界面结合了起来,这主要是通过Qt中QGLWidget这个类来实现。所以一般我们开发opengl,且要用到Qt的界面时,这些类都可以从QGLWidget继承过来。

本次试验是按照网络上NeHe写的最著名的opengl英文教程:http://nehe.gamedev.net/ 和对应的中文教程:http://www.owlei.com/DancingWind/ 的第一讲来学习的。当然也参考了网上对Nehe教程改编的Qt版:http://wenku.baidu.com/view/835b29fd941ea76e58fa04a2.html 

 

本次试验的目的很简单,只是显示一个窗口,可以通过F1键值来切换全屏显示和普通屏显示,并当按下ESE键时退出程序。窗口的颜色背景和透视效果(其实该试验都没用上)等用opengl来实现,主要是为后面的学习写了个框架,其实这里主要是重写了3个函数:initializeGL();paintGL();resizeGL();这3个函数都是QGLWidget内部的虚函数。

 

程序运行时效果如下:

  

 

程序代码如下:

glwidget.h:

复制代码
#ifndef GLWIDGET_H#define GLWIDGET_H#include <QtOpenGL>#include <QWidget>namespace Ui {class GLWidget;}class GLWidget : public QGLWidget{    Q_OBJECT    public:    explicit GLWidget(QGLWidget *parent = 0);    ~GLWidget();protected:    void initializeGL();    void paintGL();    void resizeGL(int width, int height);    void keyPressEvent(QKeyEvent *e);    bool fullscreen;    private:    Ui::GLWidget *ui;};#endif // GLWIDGET_H
复制代码

 

glwidget.cpp:

复制代码
#include "glwidget.h"#include "ui_glwidget.h"#include <QtGui>#include <QtCore>#include <QtOpenGL>GLWidget::GLWidget(QGLWidget *parent) :    QGLWidget(parent),    ui(new Ui::GLWidget){    ui->setupUi(this);    fullscreen = false;}//这是对虚函数,这里是重写该函数void GLWidget::initializeGL(){    setGeometry(300, 150, 640, 480);//设置窗口初始位置和大小    glShadeModel(GL_FLAT);//设置阴影平滑模式    glClearColor(0.5, 1.0, 0.2, 0);//改变窗口的背景颜色,不过我这里貌似设置后并没有什么效果    glClearDepth(1.0);//设置深度缓存    glEnable(GL_DEPTH_TEST);//允许深度测试    glDepthFunc(GL_LEQUAL);//设置深度测试类型    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//进行透视校正}void GLWidget::paintGL(){    //glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glLoadIdentity();//重置当前的模型观察矩阵?不是很理解!}//该程序是设置opengl场景透视图,程序中至少被执行一次(程序启动时).void GLWidget::resizeGL(int width, int height){    if(0 == height)        height = 1;//防止一条边为0    glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了    glMatrixMode(GL_PROJECTION);//选择投影矩阵    glLoadIdentity();//重置选择好的投影矩阵   // gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵    //glMatirxMode(GL_MODELVIEW);//以下2句和上面出现的解释一样    glLoadIdentity();}void GLWidget::keyPressEvent(QKeyEvent *e){    switch(e->key())    {        //F1键为全屏和普通屏显示切换键        case Qt::Key_F1:            fullscreen = !fullscreen;            if(fullscreen)                showFullScreen();            else            {                setGeometry(300, 150, 640, 480);                showNormal();            }            updateGL();            break;        //Ese为退出程序键        case Qt::Key_Escape:            close();    }}GLWidget::~GLWidget(){    delete ui;}
复制代码

 

  程序里面有很多opengl的函数暂时还用不到,因为图形学领域不熟,有些函数功能暂时也不理解,以后慢慢会懂的。

  编译时,gluPerspective处如下错误:

  C:\Users\Administrator\Desktop\tornadomeet\opengl\opengl_nehe_01\glwidget.cpp:46: error: C3861: “gluPerspective”: 找不到标识符。

  网上不少人都遇到过,貌似是Qt4.8以后的高级版本都不支持glu开头的函数了,是Nokia弄的bug,还是有什么原因故意这么弄的?据说Qt4.7.4还支持。对于我这种初学者,反正还没用到那个函数,可以不管,实在要用到时切换到4.7.4也行,还有,5.0据说9月份就要发行了,很期待。

 

附录一

因为是初学,可能有些同学不懂改怎样建立于opengl有关的工程,是用QtGUI工程,还是Qt控制台工程,或者是Qt空工程?网上貌似还没有找到比较好的介绍。下面我把我建立该工程的过程记下来(也许步骤不对,不过我这次就是这么弄的)。

开发环境:windows+Qt4.8.2+QtCreator2.5.1

1.  打开QtCreator软件,进入File-->New File or Project,左边Projects选择Application,中间选择Qt Gui Application,如下图所示:

  

 

2. 单击choose,进入下一个界面,自己填入工程名和目录(不能包含空格和中文路径)。

3. 单击next,进入下一界面,继续单击next,进入Class Information界面。类的名字自己设置,注意Base class(基类)一栏选择QWidget,不要选择QMainWidget或者QDialog,貌似我那2种试过,在本程序中修改比较大。如下图所示:

  

 

4. 单击next进入下一界面,单击Finish完成操作。

5. 打开glwidget.h文件,因为生成的文件该类是从QWidget类继承过来的,而我们是需要从QGLWidget中继承过来,所以把代码更改后如下:

复制代码
#ifndef GLWIDGET_H#define GLWIDGET_H #include <QtOpenGL/QtOpenGL>#include <QWidget> namespace Ui {class GLWidget;} class GLWidget : public QGLWidget{  Q_OBJECT  public:  explicit GLWidget(QGLWidget *parent = 0);  ~GLWidget();  private:  Ui::GLWidget *ui;}; #endif // GLWIDGET_H
复制代码

 

6. 同理,glwidget.cpp文件也更改后如下:

复制代码
#include "glwidget.h"#include "ui_glwidget.h" GLWidget::GLWidget(QGLWidget *parent) :  QGLWidget(parent),  ui(new Ui::GLWidget){  ui->setupUi(this);} GLWidget::~GLWidget(){  delete ui;}
复制代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt 是一款跨平台应用程序开发框架,它提供了丰富的功能和工具来简化应用程序的开发。OpenGL 是一种图形渲染库,用于创建高性能的2D和3D图形效果。那么,QtOpenGL 的结合能够为开发者提供强大的图形处理能力和丰富的用户界面设计功能。 在学习使用 QtOpenGL 进行应用程序开发时,书籍是非常有帮助的资源。下面是一些关于 QtOpenGL 的书籍推荐: 1.《Qt5 权威指南》:这本书全面介绍了 Qt 的各个方面,包括 Qt 的基础知识、GUI 编程、网络编程、数据库编程等内容,对初学者来说非常友好。同时,书中还有一章专门介绍了如何在 Qt 中使用 OpenGL 进行图形绘制。 2.《Qt5 与 OpenGL 高级编程指南》:这本书着重介绍了 Qt5 和 OpenGL 的结合应用,涵盖了 OpenGL 基础知识、渲染管线、光照、纹理、阴影等高级图形技术。它适合有一定编程经验且对图形编程有兴趣的开发者。 3.《OpenGL编程指南(第九版)》:虽然这本书不是专门讲解 Qt,但是它是学习 OpenGL 必备的经典教材之一。它详细介绍了 OpenGL 的基础知识和相关概念,包括顶点缓冲对象、渲染缓冲区、着色器编程等内容。通过学习这本书,开发者可以更加深入地理解 OpenGL 的工作原理。 以上是一些关于 QtOpenGL 的书籍推荐,选择适合自己水平和需求的书籍进行学习,可以帮助我们更好地掌握 QtOpenGL 的开发技巧,进而开发出功能丰富且高性能的应用程序。 ### 回答2: Qt是一种跨平台的应用程序开发框架,它提供了丰富的GUI界面设计工具和功能强大的库,可以帮助开发者轻松地开发出高质量的图形界面应用程序。而OpenGL是一种专门用于图形渲染的API,可以实现高性能、高质量的图形渲染效果。 在Qt中使用OpenGL可以帮助开发者更好地利用硬件加速来实现图形渲染,提高程序的性能和效果。因此,学习QtOpenGL的结合使用对于想要开发高质量图形应用程序的开发者来说是非常有价值的。 关于QtOpenGL的书籍,市面上有很多优秀的选择。其中,一本非常经典的书籍是《Qt5与OpenGL开发实战指南》。这本书适合有Qt基础并对OpenGL感兴趣的开发者。书中介绍了使用QtOpenGL进行图形编程的基本原理和技巧,并通过丰富的实例演示了如何使用QtOpenGL实现各种图形效果和交互特性。 除了这本书之外,还有一些其他的书籍也值得推荐。例如,《OpenGL编程指南》是一本经典的OpenGL入门书籍,可以帮助开发者深入理解OpenGL的基本原理和使用方法。《Qt5开发及实例精解》是一本全面介绍Qt开发的书籍,其中也包含了一些关于QtOpenGL结合使用的内容。 总之,选择适合自己的QtOpenGL书籍,可以帮助开发者更好地掌握QtOpenGL的基本知识和技术,从而开发出更加高效、高质量的图形应用程序。 ### 回答3: Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的图形界面和功能库,可以帮助开发者快速地构建高质量的应用程序。OpenGL则是一个用于图形渲染的开放标准,通过与Qt结合使用,可以实现更高级的图形效果和游戏开发。 对于想深入学习QtOpenGL的开发者来说,有一些经典的书籍可以提供帮助。首先推荐《Qt编程开发实战》一书,该书详细介绍了Qt的基本概念和常用功能,让读者能够快速入门。接下来,可以阅读《QtOpenGL开发指南》,该书介绍了如何使用QtOpenGL创建高级图形应用程序,并深入解析了底层原理和技术细节。此外,《OpenGL超级宝典》是一本非常经典的OpenGL入门书籍,其中包含了许多实用的代码示例和案例讲解,对于理解OpenGL的基本原理和使用方法非常有帮助。 除了这些书籍,互联网上也有许多免费的教程和博客可以供开发者参考,例如《Qt官方文档》和《OpenGL教程》等。此外,参加一些相关的培训课程或者在线教育平台提供的课程,也是学习QtOpenGL的有效途径。最重要的是,实践是学习的关键,通过动手实践一些小项目,可以帮助开发者更好地理解和应用所学知识。 总的来说,QtOpenGL是非常强大的开发工具,在学习过程中可以参考一些经典的书籍和在线资源,结合实践经验,迅速掌握它们的使用方法和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值