OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
来源:互联网 发布:割接通知 编辑:程序博客网 时间:2024/06/03 19:27
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;}
附录二
实验工程code下载。
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- OpenGL学习笔记之创建窗口
- OpenGL_Qt学习笔记之_05(纹理映射)
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- OpenGL_Qt学习笔记之_07(闪烁的星星)
- [OpenGL]创建一个窗口
- OpenGL 创建一个CEGUI窗口
- OpenGL中创建一个窗口
- 【OpenGL】创建窗口笔记拾遗
- OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
- OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- OpenGL_Qt学习笔记之_06(纹理滤波、光照和色彩融合)
- SQL学习笔记_01
- 【Codeforces Round 324 (Div 2)A】【水题】Olesya and Rodion 构造数长度为n且是t的倍数
- git 将自己本地的代码建立分支推送到远程仓库
- VC中调用dll类的方法
- iOS学习XMPP之电子名片模块
- 谈Dubbo服务框架(顶)
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- gulp
- JAVA排序汇总
- HDU 1870 愚人节的礼物
- JS 使用 window对象的print方法实现分页打印
- Qt从零开始制作串口调试助手-(第三章、菜单栏和工具栏添加)-Creator_Ly
- 黑马程序员----java基础第8天(内部类,静态内部类,匿名内部类)
- UiTextView的提示文字效果
- MPAndroidChat的PieChart和BarChart学习