1.前言

我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统。因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数。遗憾的是,如果连最基本的打开窗口的功能都没有,那么编写一个完成的图形程序简直就是天方夜谭!
GLUT库正可以弥补这个缺陷。该库可以简化打开窗口、检测输入等任务。
此外,由于OpenGL函数仅限于生成简单的几何图元(点、直线、多边形),GLUT包含了一些更为复杂的三维物体,例如球体、圆环面和茶壶(当然,OpenGL实用库也包含了一些复杂三维图形绘制函数)。
正如编程指南作者说的那样,如果想学习编写完整的OpenGL应用程序,glut无法满足要求,但是glut可以作为学习OpenGL的一个非常好的起点。

2.GLUT库功能

2.1 窗口管理

GLUT通过几个函数执行初始化窗口所需要的任务。
  • glutInit(int *arg,char ** argv);对glut进行初始化,并处理所有的命令行参数。glutInit()应该在调用其他任何GLUT函数之前调用。
  • glutInitDisplayMode(unsigned int mode);指定了是使用RGBA模式还是颜色索引模式。另外还可以指定是使用单缓冲还是使用双缓冲窗口。如果想使用颜色索引模式,就需要把一些颜色加载到颜色映射表中,这个任务可以用glutSetColor()完成。最后,还可以使用这个函数表示窗口拥有相关连得深度、模板、多重采样和或累积缓冲区。例如,需要一个双缓冲,RGBA颜色模式以及带有一个深度缓冲区的窗口,可以调用glutDisplayMode(GLUT_GOUBLE|GLUT_RGBA|GLUT_DEPTH)。
  • glutInitWindowPosition(int x,int y);指定窗口左上角的屏幕位置。
  • glutInitWindowSize(int width,int size);指定了窗口的大小,以像素为单位。
  • glutInitContextVersion(int majorVersion,int minorVersion);声明了要使用OpenGL的哪个版本。
  • glutInitContextFlags(int flags);声明了想要使用的OpenGL渲染环境的类型。对于常规的OpenGL操作,可以在自己的程序中省略这一调用,然而,如果想要使用向前兼容的OpenGL渲染环境,需要调用这一函数。
  • int glutCreateWindow(char *string)创建了一个支持OpenGL渲染环境的窗口。这个函数返回一个唯一的标志符,标示了这个窗口。注意,在调用glutMainloop()函数之前,这个窗口并没有显示

2.2 显示回调函数

glutDisplayFunc(void(*func)(void));是我们看到的第一个也是最为重要的时间回调函数。每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()注册的那个回调函数就会被执行。因此,应该把重绘场景所需要的所有代码都放在这个显示回调函数里。
如果程序修改了窗口的内容,有时候可能需要调用glutPostRedisplay(),这个函数将会指示glutMainLoop()调用已注册的显示回调函数。

2.3 运行程序

最后,必须调用glutMainLoop()开启动程序。所有已经创建的窗口将会在这里显示,对这些窗口的渲染也开始生效,事件处理循环开始启动,已注册的显示毁掉桉树被触发。一旦进入循环,他就永远不会退出。
#include "vgl.h"void init(void)
{//select clearing (background) colorglClearColor(0.0,0.0,0.0,0.0);//initialize viewing valueglMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
void display(void)
{//clear all pixelsglClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glBegin(GL_POLYGON);glVertex3f(0.25,0.25,0.0);glVertex3f(0.75,0.25,0.0);glVertex3f(0.75,0.75,0.0);glVertex3f(0.25,0.75,0.0);glEnd();glFlush();
}
int main(int argc, char **argv)
{glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(250,250);glutCreateWindow("Hello");init();glutDisplayFunc(display);glutMainLoop();//return 0;
}

2.4 处理输入事件

可以使用下面一些函数注册一些回调函数,当指定的时间发生时,这些函数便会被调用:
  • glutReshapeFunc(void(*fun)(int w,int h));表示当窗口的大小发生改变时应该采取什么行动。
  • glutKeyboardFunc(void(*Func)(unsigned char key,int x,int y));和glutMouseFunc(void(*func)(int button, int state,int x,int y));允许把键盘上的一个键或鼠标上的一个按钮与一个函数相关联,当这个键或按钮被按下或释放时,这个函数就会调用。
  • glutMotionFunc(void(*Func)(int x,int y));注册了一个函数,当按下一个鼠标按钮移动鼠标时,这个函数就会被调用。

2.5 空闲处理

可以在glutIdleFunc(void(*Func)(void))回调函数中制定一个回调函数,如果不存在其他尚未完成的事件(例如,当事件循环处于空闲的时候),就执行这个函数。这个回调函数接受一个函数指针作为他的唯一参数。如果向他传递NULL(0),那就相当于禁用这个函数。

2.6 绘制三维体

GLUT包含了几个函数,用于绘制下面这些三维物体(圆锥体,二十面体,茶壶,立方体,八面体,四面体十二面体,球体,圆环面);
可以根据已定义的法线把这些物体画成线框模型或实心模型。例如,用于绘制立方体的和球体的函数:
void glutWireCube(GLdouble size);
void glutSolidCube(GLdouble size);
void glutWireSphere(GLdouble size);
void glutSolidSphere(GLdouble size);
在绘制这些模型时,他们的中心位置都处于全局坐标系统的原点。

3.参看资料

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

OpenGL编程指南3:GLUT:OpenGL使用工具库相关推荐

  1. OpenGL编程指南1:OpenGL简介

    1.什么是OpenGL? OpenGL对场景中的图像进行渲染时所执行的主要图形操作: 根据几何图元创建形状,从而建立物体的数字描述.(OpenGL把点.直线.多边形和位图作为基本的图元). 在三维空间 ...

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

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

  3. OpenGL编程指南4:双缓冲实现运行

    1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...

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

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

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

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

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

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

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

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

  8. 《OpenGL编程指南》一第3章 OpenGL绘制方式

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

  9. 《OpenGL编程指南》一3.2 OpenGL缓存数据

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

最新文章

  1. 你和人工智能的对话,正在被人工收听
  2. 微信支付提示 缺少$key0$错误
  3. 「人工智能视觉」一直被消费者忽视的工业领域应用
  4. Android-BLE蓝牙原理
  5. Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理
  6. wireshark一招掌握如何过滤想要的数据再也不用查找天书般的说明文档
  7. poj 2385Apple Catching(简单dp)
  8. winform登录时,在密码框按下回车,直接登陆
  9. LINQ to XML 操作XML文档
  10. aiohttp/flask python后端单元测试,单元测试覆盖率测试
  11. linux防火墙的策略规则
  12. python生成条形码和二维码
  13. 数字化测图是利用计算机自动绘制地形图,数字化测图详解
  14. oracle 中explain,oracle执行计划的使用(EXPLAIN)
  15. 如何用艺术字制作水印?教你一招快速制作专属水印
  16. python爬取周杰伦歌词_Python 爬取周杰伦 instagram
  17. 互联网经典商战TOP 10
  18. python里的百分号_python中的百分号
  19. 小白如何自学编程? 看完这篇这些雷和坑千万不要踩!
  20. Android 关于AIDL通信,RemoteCallbackList实现Server回调Client

热门文章

  1. tomcat下manager配置
  2. C++走向远洋——26(项目二,2,构造函数与析构函数)
  3. Mac下安装及使用rz、sz远程上传下载文件
  4. 太极团队内部邮件曝光:iOS8完美越狱重大突破
  5. 务实云计算培训:帮您顺利走好云之旅
  6. [导入]ASP.NET26个常用性能优化方法
  7. hdu 5616 Jam's balance(简单dp)
  8. centos 安装nginx笔记
  9. nodejs后台启动
  10. linux 系统调用分析