Qt下的OpenGL 编程(8)文字、FPS、动画
来源:互联网 发布:大数据时代案例 编辑:程序博客网 时间:2024/06/05 21:58
一、提要
今天的学习内容是在OpenGL的窗口中显示文字,实现FPS的显示,还有
OpenGL中动画的实现。
二、HelloWorld
关于位图文字的显示,nehe的教程只在windows下实现了,而相关了Linux下的实现
也需要借用其他的库,编程指南看了之后头更加大,于是我翻开了Qt帮助......
在QGLWidget的说明文档里,很幸运地找到了这个函数:
void QGLWidget::renderText ( int x, int y, const QString & str, const QFont & font = QFont(), int listBase = 2000 );
它的作用就是在渲染窗口显示文字了,前两个参数是位置坐标str是想要显示的字符串,font是希望使用的字体,最后
一个不用管.
最后一个不用管,后面版本的Qt会把它删掉。
还有比这更简单的方法吗!?
赶快来实践一下。
还是原来的框架,修改pantGL():
void NeHeWidget::paintGL(){
// 清除屏幕和深度缓存glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glLoadIdentity();
//移到屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景
glTranslatef(0.0f,0.0f,zoom);
glBegin(GL_TRIANGLES);// 绘制三角形glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);// 上顶点glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);// 左下glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);// 右下glEnd();
renderText(100,100,"HelloWorld! ",fpsFont);}
三、Fps
frames per second(FPS, 帧率),作为渲染效率的一种衡量,反映的是整个程序在当前的一个渲染状态下平均每秒所能容纳的“渲染循环”执行次数,也表征了平均每个“渲染循环”(帧)所用的时间。就表面来看,很多人觉得只要在一个每帧运行一次的函数内设置一个计数器,这样计算出一秒内的记数,便可作为该1s瞬间的FPS了;同样也很容易能求出平均FPS。
为实现FPS的计算,我们在nehewidget类中添加 void calFrequency(),实现如下:
void NeHeWidget::calFrequency(){
static QString tmp="";static float framesPerSecond=0.0f;//fps的数值static float frames = 0.0f; // 用于存储渲染的帧数static float lastTime = 0.0f; // 前一秒的时刻float currentTime = glutGet(GLUT_ELAPSED_TIME)* 0.001f;//程序运行的时间++frames;
if( currentTime - lastTime > 1.0f )//,每秒刷新一次{
framesPerSecond=frames;
tmp.setNum(framesPerSecond);
lastTime = currentTime;frames= 0;}
renderText(100,100,"FPS: "+tmp,fpsFont);//最终结果在窗口中渲染}
将这个函数加载paintGL()里,那么每次渲染的时候,这个函数都会被调用一次,FPS的值会在窗口的左上角显示。
四、动画
为了实现动画,我们需要在添加一个计时器。
//计时器,实现动画
QTimer *timer;然后在构造函数中将它初始化
timer = new QTimer(this);timer->start(30);
connect(timer,SIGNAL(timeout()),this,SLOT(updateGL()));
这样,计时器每30毫秒就会发出一个信号,updateGL()会被触发。
下面的例子是一个不断变色的三角形,主要代码如下:
void NeHeWidget::paintGL()
{// 清除屏幕和深度缓存glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glLoadIdentity();
//移到屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景
glTranslatef(0.0f,0.0f,zoom);
glBegin(GL_TRIANGLES);// 绘制三角形glColor3f(1.0f,0.0f+colorSpan,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);// 上顶点glColor3f(0.0f,1.0f-colorSpan,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);// 左下glColor3f(0.0f+colorSpan,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);// 右下glEnd();
if(colorSpan<1&&colorSpan>=0) colorSpan+=0.01;else colorSpan=0;//fps的字体颜色
glColor3f(0.0f,0.0f,1.0f);
glFinish();
//计算FPS
calFrequency();
}最终效果如下:
四.参考资料
1. 《 OpenGL Reference Manual 》, OpenGL 参考手册
2. 《 OpenGL 编程指南》(《 OpenGL Programming Guide 》), Dave Shreiner , Mason Woo , Jackie Neider , Tom Davis 著,徐波译,机械工业出版社
3. 《win32 OpenGL编程 》 一个大牛的博客 http://blog.csdn.net/vagrxie/article/category/628716/34. 《OpenGL函数思考 》 里面有很多OpenGL函数的通俗解释 http://blog.csdn.net/shuaihj
- Qt下的OpenGL 编程(8)文字、FPS、动画
- Qt下的OpenGL 编程(8)文字、FPS、动画
- Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤
- Qt下的OpenGL 编程(2)动手搭建Qt下的OpenGL编程框架
- Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤
- Qt下的OpenGL 编程(2)动手搭建Qt下的OpenGL编程框架
- Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤
- Qt下的OpenGL 编程(2)动手搭建Qt下的OpenGL编程框架
- Qt下的OpenGL 编程(3)绘制平面几何体
- Qt下的OpenGL 编程(10)Solar System
- Qt下的OpenGL 编程(12)阶段学习总结
- Qt下的OpenGL 编程(3)绘制平面几何体
- Qt下的OpenGL 编程(10)Solar System
- Qt下的OpenGL 编程(12)阶段学习总结
- Qt下的OpenGL 编程(3)绘制平面几何体
- 搭建Qt下的OpenGL编程框架
- Qt下的OpenGL 编程(11)Qt实例hellogl代码解析
- Qt下的OpenGL 编程(11)Qt实例hellogl代码解析
- 正则表达式入门教程
- java GUI
- Qt下的OpenGL 编程(7)顶点数组和显示列表
- Oracle10g服务“启动”和”停止“的bat文件
- 修改IOS程序在异常退出时,再次开启会crash的问题
- Qt下的OpenGL 编程(8)文字、FPS、动画
- 详解四:CentOS下编译安装PHP开发环境,配置LAMP
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- 杂记之C语言之动态内存分配malloc
- 南北桥芯片的位置及作用
- Qt下的OpenGL 编程(10)Solar System
- 计算机考研参考书目
- 模板方法模式深度解析(一)
- Safe Or Unsafe hdu2527