1.前言

绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法。

同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数。

2.OpenGL编程及程序剖析

/*****************************************************************Rendering a rotating square,display how to use glutSwapBuffers()*Author:Ziheng H. Shen @ Graduate School of Tsinghua Univ.****************************************************************/
#include <vgl.h>static GLfloat spin = 0.0;void init(void)
{glClearColor(0.0,0.0,0.0,0.0); //清空当前所偶有颜色glShadeModel(GL_FLAT); //设置着色模式
}
void display(void)
{glClear(GL_COLOR_BUFFER_BIT); //清除viewport的缓冲区glPushMatrix();//将当前矩阵保存入堆栈顶(保存当前矩阵)glRotatef(spin,0.0,0.0,1.0);glColor3f(1.0,0.0,0.0);glRectf(-25.0,-25.0,25.0,25.0);glPopMatrix();glutSwapBuffers();//实现双缓冲技术,交换两个缓冲区指针。
}
void spinDisplay(void)
{spin = spin + 2.0;if(spin > 360.0)spin = spin - 360.0;glutPostRedisplay(); // 标记当前窗口需要重新绘制
}
void reshape(int w,int h)
{glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵glLoadIdentity(); //重置当前指定的矩阵为单位矩阵glOrtho(-50,50,-50,50,-1,1); //将当前的可视空间设置为正投影空间glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
/**************************************************/
void mouse(int button, int state, int x,int y)
{switch (button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);//全局的回调函数,响应鼠标左键操作,更新图像旋转之后结果break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(NULL); //全局回调函数,响应鼠标中键操作break;default:break;}
}
/**Request double buffer display mode.*Register mouse input callback functions.*/
int main(int argc, char** argv)
{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(250,250);glutInitWindowPosition(0,0);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape); //窗口改变的时候调用的函数glutMouseFunc(mouse); //响应鼠标事件glutMainLoop();return 0;
}

输出结果:

3.函数解析

3.1 glClearColor

通过glClear使用红,绿,蓝以及AFA值来清除颜色缓冲区的,并且都被归一化在(0,1)之间的值,其实就是清空当前的所有颜色。

3.2 glShadeModel

void glShadeModel ( GLenum mode)是OpenGL1.0提供的接口。作用是设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过差值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色差值得到。

3.3 glClear

void glClear(GLbitfield mask);
参数说明:
GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位
GL_COLOR_BUFFER_BIT:   当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT:   深度缓冲
GL_ACCUM_BUFFER_BIT:   累积缓冲
GL_STENCIL_BUFFER_BIT: 模板缓冲

3.4 glPushMatrix && glPopMatrix

glPushMatrix(),glPopMatrix()这两个函数是搭配使用的,中间放置几何变换。glPushMatrix()的作用是把矩阵压入栈中保存起来,留着以后再用,就好象把子弹压入枪膛一样。但这个压子弹不是简单滴丫,它是把和弹夹的最顶的那颗子弹一模一样的子弹压入弹夹。假如说弹夹的子弹从下往上装的子弹各不相同,依次为A1型子弹,B2型子弹,C3型子弹glPushMatrix()的作用就是现时打造一颗C3型子弹并把它压入弹夹,于是弹夹最顶端的两颗子弹是一样的,都是C3型的子弹,随后所作的平移变化旋转变换等都是在最上面那颗C3子弹上所作的,并不影响下面的那颗C3子弹,直到glPopMatrix()把最上面的那颗C3子弹发射出去,让下面的那颗C3子弹成为弹夹最顶上的那颗。

3.5 glutSwapBuffers

glutSwapBuffers函数是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数。该函数的功能是交换两个缓冲区指针。

3.6 glutPostRedisplay

glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。

3.7 glutIdleFunc

glutIdleFunc设置全局的回调函数,当没有窗口事件到达时,GLUT程序功能可以执行后台处理任务或连续动画。如果启用,这个idle function会被不断调用,直到有窗口事件发生。回调函数没有参数。

3.8 glutReshapeFunc与glutDisplayFunc

glutReshapeFunc是窗口改变的时候调用的函数,在这个里面可以根据缩放后的窗口重新设置camera的内部参数,比如横纵比啥的;
glutDisplayFunc是显示的时候调用,可见改变窗口后调用glutReshapeFunc后还是会调用glutDisplayFunc进行显示的。
不可以不用glutDisplayFunc,比如你想实现动画效果,也就是说窗口大小不变而里面的内容发生变化,这时候通过设置glutIdelFunc,在里面最后调用glutPostdisplay,来通知glutdisplayFuc重画,实现动画。
简单的说,glutReshapeFunc与glutIdelFunc这些函数都不去直接处理显示,而是设置好相应的参数,让glutdisplayfunc来执行绘制。

4.参看资料

[1]施莱尔, GrahamSellers, JohnKessenich,等. OpenGL编程指南[M]. 机械工业出版社, 2014.

OpenGL编程指南4:双缓冲实现运行相关推荐

  1. OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结

    弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...

  2. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  3. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  4. OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器

    转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...

  5. OpenGl编程指南例2.4大白话分析

    OpenGl编程指南例2.4分析 即上一篇文章搭建了opengl的环境后,继续学习Opengl,被第二章的各种gen,bind,buffer搞得晕头转向,在还没有消化完全的时候,又被一计重击打到--为 ...

  6. 《OpenGL编程指南》一第2章 着色器基础

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...

  7. OpenGL编程指南7:视图-

    1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...

  8. OpenGL编程指南5:学习绘制不同风格的曲线

    1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...

  9. opengl编程指南第8版源码编译详细说明

    1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...

最新文章

  1. keil debug如何在watch直接修改变量值_printf系列教程03_SWO打印输出配置,基于Keil『Debug(printf)Viewer』...
  2. 各种排序算法及其java程序实现
  3. 一次性缴纳6万元,退休后每月领1500元养老金,你愿意吗?
  4. [笔记]提升R的性能和突破内存限制的技巧
  5. 训练日志 2019.7.24
  6. oracle无+密码登陆,Oracle 11g通过wallet实现无密码登录
  7. Vue之不常注意的点
  8. VB 判断IP能否ping通
  9. access 文本转换数字_ACCESS的短文本和长文本分类
  10. Python数据结构与算法(1.4)——Python基础之控制结构
  11. 解决Android App启动页背景图片拉伸变形问题
  12. 芒格:倒过来思考有利于理解事物本质并解决问题
  13. Qt_QTableWidget用法 添加、删除、添加控件、获取控件在表格中位置
  14. epoll 为什么用红黑树?
  15. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值
  16. xm-select的简单使用
  17. DRM系列(7)之drmModeAtomicCommit底层流程
  18. Java面试错题集1
  19. ORACLE 复制表
  20. 网络标准(从一类线到八类线)

热门文章

  1. 基于Web的质量和测试度量指标
  2. asp.net用户登录 用户验证
  3. 服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
  4. 图文说明如何使用T4在VS2008里生成代码
  5. Session.Abandon和Session.Clear有何不同
  6. 阿森纳如果小组第二出线
  7. windows2003的一些设置之一
  8. JSP简单练习-省略显示长字符串
  9. reduction_indices的用法
  10. 2018-2019-1 20189210 《LInux内核原理与分析》第六周作业