OpenGL三维图形编程
              OpenGL概述

               主讲: 李胜
参考书
 《OpenGL编程指南》,人民邮电出版社,俗称
“OpenGL红宝书”
课程网站
 http://www.graphics.pku.edu.cn/lectures/CG/home.htm
第三章 OpenGL概述

OpenGL发展历史       OpenGL渲染流水线
OpenGL基本特点       OpenGL相关函数库
OpenGL与DirectX   使用GLUT函数库
OpenGL基本功能       使用WGL函数库
OpenGL语法特点       OpenGL相关资源
OpenGL状态机制       作业

     建立OpenGL中的重要概念
OpenGL发展历史(1/8)

一幅图胜过千言万语
在研究三维图形的过程中,人们开发了各种图
形工具库(软件包,即一系列函数的集合)
 第一个图形软件包:图形核心系统,GKS
 ISO(国际标准化组织)和ANSI(美国标准化所)标
 准:层次结构交互图形系统,PHIGS,扩充后形成
 PHIGS+
 SGI的图形库:GL,扩充后形成OpenGL,实际上的
 图形工业标准
 ……
OpenGL发展历史(2/8)

OpenGL(开放性图形库Open Graphics Library)
标准
 GL:美国SGI公司为图形工作站开发的一种功能强大
 的三维图形机制
 经过长期发展,在跨平台移植的过程中,由GL扩充
 形成
 背靠SGI 公司,技术实力强大
 研发资金充盈,由成立于1992年的独立财团OpenGL
 Architecture Review Board (OARB)控制
OpenGL发展历史(3/8)

OpenGL标准
 由SGI等OARB成员以投票方式产生标准
 OARB公布规范文档(Specification),各软
 硬件厂商据此开发自己系统上的实现
 只有通过了OARB规范全部测试的实现才能
 称为OpenGL
OpenGL发展历史(4/8)

OpenGL标准
 1.0版,1992年7月
 1.1版,1995年12月
 1.2版,1998年3月,最常用版本
 1.2.1版,1998年10月
 1.3版,2001年8月
 1.4版,2002年7月
 1.5版,2003年7月,
 2.0版,2005年 最新版本
OpenGL发展历史(5/8)

OpenGL成为高性能图形和交互式视景处理的工
业标准
 SGI、IBM、DEC、SUN、HP等大型硬件厂商都采用
 OpenGL作为三维图形标准
 动画软件Soft Image、动画软件3D Studio MAX、仿
 真软件Open Inventor、VR(虚拟现实)软件World
 Tool Kit、CAM(计算机辅助制造)ProEngineer、
 GIS(地理信息系统)软件ARC/INFO等软件的制造
 厂商都以OpenGL为基础进行开发
OpenGL发展历史(6/8)

OpenGL成为高性能图形和交互式视景处
理的工业标准
 NVIDIA、ATI等显卡制造商支持OpenGL标准
 Windows系列、Linux、Unix、OS/2等各平台
 都提供对OpenGL的支持
OpenGL发展历史(7/8)

OpenGL的普及应用
 计算机硬件性能的提高和OpenGL本身的不断
 发展,使得OpenGL不再只属于专用图形工作
 站
 开发人员可以在各种硬件平台利用OpenGL进
 行图形软件开发
 进行图形开发实践的必备工具
OpenGL发展历史(8/8)

OpenGL并不是唯一
 OpenGL是一个相当流行的高性能图形处理标
 准,但并不是唯一的图形处理开发包
 世界上还存在比OpenGL更优秀、更专业(功
 能专一,且纯粹)的开发包,也许并不是标
 准,但应用于一些超高端的、更专业的图形
 工作站,服务于一些特定应用(电影制作、
 游戏等等)
OpenGL基本特点(1/3)

跨平台的工业标准
标准支持灵活
各平台开发商可以自由地开发适合于各自系
统的OpenGL执行实例
OpenGL功能可由特定的硬件实现,也可用纯
软件例程实现,或者以软硬件结合的方式实
现,只要支持标准即可
OpenGL基本特点(2/3)

运行稳定,容易使用
只要硬件支持OpenGL标准即可使用
屏蔽硬件细节
具有良好的伸缩性
基于OpenGL API的图形应用程序可以运行在
许多系统上,包括各种用户电子设备、PC、
工作站以及超级计算机
OpenGL基本特点(3/3)

具有良好的扩展性
OpenGL标准提供了一套良好的功能扩充机制
硬件升级后,可以遵循OpenGL扩展机制提供
相应的OpenGL函数
一个成功的OpenGL扩展会被融入在未来的
OpenGL版本之中
因此,OpenGL能紧跟最新硬件发展和计算机
图形绘制算法的发展
OpenGL与DirectX(1/5)

DirectX简介
 DirectX是Microsoft公司开发的底层应用程序
 接口,用于Windows平台下游戏软件和多媒
 体系统的开发
 DirectX库采用COM组件思想设计,提供二进
 制级的组件接口
OpenGL与DirectX(2/5)

DirectX简介
 DirectX提供多媒体程序开发所需的全面的API支持
   图形,DirectX Graphics
   声音,DirectSound,DirectMusic
   交互,DirectInput
   多人网络游戏,DirectPlay
   流媒体,DirectShow
 现在DirectX的稳定版本是8.0和9.0C
 最新的DX10是只支持Vista平台
OpenGL与DirectX(3/5)

OpenGL与DirectX的相同点
 在图形绘制部分,基于相同的计算机图形学
 原理实现
 提供绘制能力相当的图形绘制API(现在
 Windows平台上常用的OpenGL库,也是
 Microsoft依据OpenGL标准实现的)
OpenGL与DirectX(4/5)

OpenGL与DirectX的不同点
 OpenGL是跨平台标准,且有各个平台的实现;
 DirectX仅仅应用于Windows,由Microsoft独立开发
 OpenGL仅仅提供图形绘制功能,甚至没有交互功
 能;DirectX则提供了多媒体程序开发所需的全部API
 OpenGL是函数库;DirectX则是组件库
 OpenGL各版本向后兼容;DirectX的体系结构则在不
 停变化,并不向后兼容
OpenGL与DirectX(5/5)

目前应用
一般显卡厂商都支持OpenGL和DirectX,同时
针对两者进行硬件优化
教学、科研方面OpenGL是主流,游戏开发、
商业应用则基本采用DirectX
需要跨平台应用时,只能用OpenGL
OpenGL基本功能(1/11)

物体建模与图元(Primitive)绘制
矩阵变换
颜色管理
光照和材质
纹理映射(Texture mapping)
反走样(Antialiasing)
图像特效
双缓存(Double buffering)动画
OpenGL基本功能(2/11)

物体建模与图元(Primitive)绘制
 OpenGL认为,所有的物体都是由点、线、多
 边形构成的,点、线、多边形被称为图元
 (Primitive)
 OpenGL一共定义了十种图元(Primitive)
OpenGL基本功能(3/11)

    物体建模与图元(Primitive)绘制

            GL_LINES
                                                         GL_POLYGON
                       GL_LINE_STRIP   GL_LINE_LOOP
GL_POINTS



                GL_TRIANGLES

                                            GL_QUADS
                                                       GL_QUAD_STRIP
GL_TRIANGLE_STRIP         GL_TRIANGLE_FAN
OpenGL基本功能(4/11)

物体建模与图元(Primitive)绘制
 物体建模的意思就是将物体用图元(Primitive)
 表示,由于三点决定一个平面,所以物体常
 用三角面片来表示,三角面片越多,物体越
 复杂
 OpenGL提供了各种图元的绘制函数,以及一
 些复杂三维物体(球、锥、多面体、茶壶)、
 曲线曲面(贝塞尔、NURBS)的绘制函数
OpenGL基本功能(5/11)

矩阵变换
无论多复杂的图形都是由基本图元组成并经
过一系列变换来实现的
OpenGL提供四种基本变换:平移、旋转、按
比例缩放、镜像
OpenGL提供两种投影变换:平行投影(正射
投影)、透视投影
OpenGL基本功能(6/11)

颜色管理
 OpenGL提供了两种颜色模式:RGBA模式,颜色索
 引模式(Color index)
 RGBA模式为每个像素点指定颜色,可提供丰富多彩
 的色彩效果,其中A是混合因子,用于各种特效处理
 对于显示能力不足的硬件,可采用颜色索引模式,系
 统提供一个颜色表,通常有256或4096种颜色,各像
 素点通过索引颜色表项得到颜色值
OpenGL基本功能(7/11)

光照和材质
在现实生活中,物体因为受光照射和自身对
各种频率光波的吸收与反射能力的不同,而
呈现各自不同的颜色
OpenGL的实现
 假设光仅仅由三原色(RGB)组成
 物体对三原色分别有不同的反射率(即材质)
 利用物理光学模型,计算物体实际的颜色
OpenGL基本功能(8/11)

纹理映射(Texture mapping)
 由于物体采用图元(Primitive)表示(点、线、多边
 形),绘制时,有效渲染的地方也仅仅是这些点、线、
 多边形,其它位置的颜色值则通过插值实现,这就造
 成了物体绘制的不真实
 纹理映射通过贴图的方式,为物体表面贴上真实的色
 彩花纹,这些被指定贴上的图片,就称作纹理
 (Texture)
 OpenGL提供了完善的纹理映射机制
OpenGL基本功能(9/11)

反走样(Antialiasing)
 线段在计算机中是通过一系列的像素来近似
 逼近的,而这些像素实际上是一个个的小正
 方形,因此线段常常呈锯齿状,这被称为走
 样(Aliasing)
 OpenGL通过计算线段对各个像素的不同覆盖
 率来实现反走样(Antialiasing)
OpenGL基本功能(10/11)

图像特效
融合(Blending)
 为了使三维图形更加具有真实感,经常需要处理
 半透明或透明的物体图像,这就需要用到融合技
 术
雾(fog)
 正如自然界中存在烟雾一样,OpenGL提供了"fog"
 的基本操作来达到对场景进行雾化的效果
OpenGL基本功能(11/11)

双缓存(Double buffering)动画
 出色的动画效果是OpenGL的一大特色
 OpenGL通过双缓存实现动画
   前台缓存显示当前帧
   后台缓存同时进行后续帧的场景计算,生成画面
OpenGL语法特点(1/5)

所有OpenGL函数都使用“gl”作为前缀
 如 glClearColor()
所有OpenGl常量都使用“GL_”开头,并且
所有字母都大写
 如 GL_FALSE
OpenGL语法特点(2/5)

OpenGL函数后缀说明
 后缀中的阿拉伯数字一般表示参数的数目
  如 glVertex2i(1, 3),表示该函数有两个参数
 阿拉伯数字后的小写字符(一个或多个)表
 示参数类型
  如 glVertex2i(1, 3),表示该函数的两个参数都为32
  位整数(Integer)
  表示参数类型的后缀定义见下表
OpenGL语法特点(3/5)

OpenGL函数后缀说明
OpenGL语法特点(4/5)

OpenGL函数后缀说明
 有些函数最后一个字母为“v”,则表示该函数
 参数为向量(Vector),即数组
 此时,前面的阿拉伯数字表示可接受向量
 (数组)的长度
  如 glColor3fv(color_array),表示color_array为一数
  组,该数组有三个元素,每个元素的类型都为32
  位浮点数(Float)
OpenGL语法特点(5/5)

OpenGL数据类型
 开发OpenGL程序时,为便于程序移植,最好
 使用OpenGL的数据类型定义
  例如,尽量使用“GLint”,而不是用C或C++的“int”
OpenGL状态机制(1/2)

OpenGL是一个状态机(State machine)
设置的状态将一直保持,直到显示改变
 例如,调用 glColor3f(1.0, 1.0, 0.0) 设置当前
 颜色为黄色之后,除非再次调用 glColor* 函
 数,系统的当前颜色将一直保持为黄色
状态变量通过函数 glEnable() 和 glDisable()
进行激活或取消的设置
OpenGL状态机制(2/2)

每一个状态变量都有系统默认的缺省值
状态变量的当前值可以通过一系列函数查询
 glGetBooleanv()
 glGetDoublev()
 glGetFloatv()
 glGetIntegerv()
 glGetPointerv()
 glIsEnabled()
OpenGL渲染流水线(1/20)

大多数OpenGL应用程序都采用一个相似
的操作顺序,这一系列处理阶段被称作
OpenGL的渲染流水线(Pipeline)
OpenGL渲染流水线(2/20 )

   OpenGL渲染流水线
 顶点数据                               对每个顶点的操作以及
Vertex data                                图元装配
                        求值器          Per-vertex operations
                       Evaluators   and primitive assembly

                                                                         对每个片元的操作
        显示列表                                           光栅化                                 帧缓存
                                                                          Per-fragment
        Display list                                 Rasterization                       Framebuffer
                                                                           operations


                                         像素操作
                                      Pixel operations
像素数据                                                             纹理装配
Pixel data                                                    Texture assembly
OpenGL渲染流水线(3/20 )

OpenGL的渲染流水线的构架基于计算机
图形学的基本原理
对于一个实际的OpenGL程序,并不一定
会应用渲染流水线中的每一步操作
OpenGL渲染流水线(4/20 )

熟练掌握渲染流水线是学习好OpenGL和
图形学的关键,渲染流水线也是学习
OpenGL和图形学的纲领
以后的每一章节基本上是对流水线某一部
分的展开阐述
总而言之,对于OpenGL本身,这套流水
线机制是最重要的,应该时时复习和回顾
OpenGL渲染流水线(5/20)

  OpenGL渲染流水线的两条数据处理路径
        顶点数据,基本的几何数据
        像素数据,图像特效,纹理数据
 顶点数据                               对每个顶点的操作以及
Vertex data                                图元装配
                        求值器          Per-vertex operations
                       Evaluators   and primitive assembly

                                                                         对每个片元的操作
        显示列表                                           光栅化                                 帧缓存
                                                                          Per-fragment
        Display list                                 Rasterization                       Framebuffer
                                                                           operations


                                         像素操作
                                      Pixel operations
像素数据                                                             纹理装配
Pixel data                                                    Texture assembly
OpenGL渲染流水线(6/20)

   顶点数据
         物体都用图元(Primitive)表示,图元的实质就是点
         集,在OpenGL中,所有的物体、几何元素最终都以
         顶点的形式描述
         顶点数据包括顶点位置(即空间坐标)、大小、颜色、
         顶点法向量(用于光照计算)、纹理坐标(可能有多
         个)等等

 顶点数据
Vertex data
OpenGL渲染流水线(7/20)

   求值器
         参数化的曲面曲线(如贝塞尔,NURBS曲面曲线)
         并不直接给出顶点,而是给出一系列控制点及其生成
         曲面曲线的函数
         求值器的功能就是,通过控制点和生成函数,得到实
         际使用的顶点数据
         对于非参数化曲面曲线,这一步是被忽略的

 顶点数据
Vertex data
               求值器
              Evaluators
OpenGL渲染流水线(8/20)

   对每个顶点的操作
         通过模型、视图变换矩阵,将所有顶点坐标变换为以
         人眼坐标系下一致的坐标
              确定要绘制的场景区域(视图变换,改变视点的位置和方向)
              确定模型与要绘制的场景区域的位置关系(模型变换,移动
              模型)
              OpenGL中,将模型视图变换结合为一个统一的矩阵
         变换矩阵同样改变物体的顶点法向量
 顶点数据                         对每个顶点的操作以及
Vertex data                          图元装配
                  求值器          Per-vertex operations
                 Evaluators   and primitive assembly
OpenGL渲染流水线(9/20)

   对每个顶点的操作
         如果激活了纹理,还可能进行纹理坐标转换,以及自
         动纹理坐标的生成
         如果激活了光照,则还需要利用光源、材质、转换后
         的顶点位置和法向量计算每一个顶点的颜色




 顶点数据                      对每个顶点的操作以及
Vertex data                       图元装配
               求值器          Per-vertex operations
              Evaluators   and primitive assembly
OpenGL渲染流水线(10/20)

   图元装配
         通过投影变换,定义一个适当的视图体
              透视投影视图体,平截台体,形成正常观察场景
              正交投影视图体,成直角的平行六面体,应用于建筑设计及
              计算机辅助设计




 顶点数据                         对每个顶点的操作以及
Vertex data                          图元装配
                  求值器          Per-vertex operations
                 Evaluators   and primitive assembly
OpenGL渲染流水线(11/20)

   图元装配
         某些情况下,需要进行透视除法,以得到归一化的设
         备坐标
         对于落在视图体之外的物体,需要进行裁剪(Clip)
         操作
              点裁剪,直接删除落在视图体之外的顶点
              直线、多边形裁剪,在删除顶点的同时需要增加顶点(即直
              线、多边形和视图体形成的交点)
 顶点数据                         对每个顶点的操作以及
Vertex data                          图元装配
                  求值器          Per-vertex operations
                 Evaluators   and primitive assembly
OpenGL渲染流水线(12/20)

   图元装配
         视区变换,用来确定最终图像的显示位置和大小




 顶点数据                      对每个顶点的操作以及
Vertex data                       图元装配
               求值器          Per-vertex operations
              Evaluators   and primitive assembly
OpenGL渲染流水线(13/20)

   对每个顶点的操作和图元装配

        对象坐标                 人眼坐标                    裁剪                       归一化                        窗口坐标
         Object               Eye                    Clip                    Normalize                   Window


   顶点          模型视图矩阵                 投影矩阵                       透视除法                   视区变换
  Vertex      Modelview matrix      Project matrix          Perspective division    Viewport transform




 顶点数据                                        对每个顶点的操作以及
Vertex data                                         图元装配
                            求值器               Per-vertex operations
                           Evaluators        and primitive assembly
OpenGL渲染流水线(14/20)

   光栅化(Rasterization)
         光栅化负责将几何数据和像素数据转换为片元
         (Fragment)
         片元和将来要显示的像素一一对应
         为每一个片元指定颜色和深度值
         雾(Fog)、纹理(Texture)操作
 顶点数据                      对每个顶点的操作以及
Vertex data                       图元装配
               求值器          Per-vertex operations
              Evaluators   and primitive assembly


                                             光栅化
                                           Rasterization
OpenGL渲染流水线(15/20)

   对每个片元(Fragment)的操作
         在片元数据最终写入帧缓存前,还有一系列测试和处
         理过程
              剪取(Scissor)测试、alpha测试、模板(Stencil)测试、深
              度(Depth)测试
              融合(Blending)、抖动(Dithering)、逻辑操作

 顶点数据                           对每个顶点的操作以及
Vertex data                            图元装配
                    求值器          Per-vertex operations
                   Evaluators   and primitive assembly

                                                                对每个片元的操作
                                                  光栅化
                                                                 Per-fragment
                                                Rasterization
                                                                  operations
OpenGL渲染流水线(16/20)

   帧缓存
         帧缓存内的数据将直接输出到显示器
         可以激活双缓存模式



 顶点数据                      对每个顶点的操作以及
Vertex data                       图元装配
               求值器          Per-vertex operations
              Evaluators   and primitive assembly

                                                           对每个片元的操作
                                             光栅化                             帧缓存
                                                            Per-fragment
                                           Rasterization                   Framebuffer
                                                             operations
OpenGL渲染流水线(17/20)

  像素数据
         像素数据的两种获取模式
             由程序指定,直接存放在内存中
             从帧缓存中取得上一帧输出图像的数据
         像素数据可以直接传递给光栅化过程


像素数据
Pixel data
OpenGL渲染流水线(18/20)

  像素操作
         像素数据的读取、写入、拷贝
         像素传递
         像素映射
         图像的放大、缩小、翻转
         其它针对像素的操作   光栅化
                                                 对每个片元的操作
                                                  Per-fragment
                                                                   帧缓存
                                 Rasterization                   Framebuffer
                                                   operations


                     像素操作
                  Pixel operations
像素数据
Pixel data
OpenGL渲染流水线(19/20)

纹理装配
OpenGL提供了一整套纹理映射的机制
纹理数据的两种获取方式:
 由程序指定,直接存放在内存中
 从帧缓存中取得上一帧输出图像作为纹理数据
纹理数据直接传递给光栅化过程
                                 对每个片元的操作
               光栅化                                 帧缓存
                                  Per-fragment
             Rasterization                       Framebuffer
                                   operations




                         纹理装配
                      Texture assembly
OpenGL渲染流水线(20/20)

显示列表(Display list)
 显示列表就是一组函数集,可以用来反复执
 行,以提高绘制速度
 对顶点数据和像素数据的处理都可以用显示
 列表进行组织
OpenGL相关函数库(1/9)

OpenGL核心库(GL)
OpenGL实用库(GLU)
OpenGL辅助库(GLAUX)
OpenGL工具库(GLUT)
OpenGL对窗口系统的扩展(WGL,等等)
OpenGL相关函数库(2/9)

对于各个库,函数功能可分为两大类
渲染功能
 提供图形绘制所需的各种功能函数
窗口管理功能
 管理窗口系统的所有相关功能,如键盘鼠标的响
 应,各种窗口事件等等
OpenGL相关函数库(3/9)

OpenGL核心库(GL)
 这部分函数用于常规的、核心的图形处理,是
 OpenGL的核心部分
 包含300多个函数,函数名前缀一律是“gl”
 Windows平台上
  头文件“GL.H”
  库文件“OPENGL32.LIB”
  动态链接库“OPENGL32.DLL”
 核心库可以在所有的OpenGL平台上运行
OpenGL相关函数库(4/9)

OpenGL实用库(GLU)
 这部分函数通过调用核心库的函数,为开发者提供相
 对简单的用法,实现一些较为复杂的操作。如:坐标
 变换、纹理映射、绘制椭球、茶壶等简单多边形
 包含约50个函数,函数名前缀一律是“glu”
 Windows平台上
  头文件“GLU.H”
  库文件“GLU32.LIB”
  动态链接库“GLU32.DLL”
 实用库可以在所有的OpenGL平台上运行
OpenGL相关函数库(5/9)

OpenGL辅助库(GLAUX)
 这部分函数提供窗口管理、输入输出处理以及绘制一
 些简单三维物体
 包含约30个函数,函数名前缀一律是“aux”
 Windows平台上
  头文件“GLAUX.H”
  库文件“GLAUX.LIB”
  动态链接库“GLAUX.DLL”
 OpenGL中的辅助库不能在所有的OpenGL平台上运行
OpenGL相关函数库(6/9)

OpenGL工具库(GLUT)
 由Mark Kilgard开发
 这部分函数主要提供基于窗口的工具,以及一些绘制
 较复杂物体的函数
 包含大约30多个函数,函数名前缀为“glut”
 Windows平台上
  头文件“GLUT.H”
  库文件“GLUT32.LIB”
  动态链接库“GLUT32.DLL”
 glut中的窗口管理函数不依赖于运行环境的,可以在
 所有的OpenGL平台上运行
OpenGL相关函数库(7/9)

OpenGL对窗口系统的扩展
 对于各类窗口系统,OpenGL都提供了一个扩
 展库
 对于Windows系统,OpenGL提供WGL库
  并不是所有的函数前缀都是“wgl”
  用于连接OpenGL和Windows,在Windows平台上
  设置OpenGL环境
  头文件是“WINGDI.H”
  只能在Windows平台上运行
OpenGL相关函数库(8/9)

OpenGL程序开发中,常用的函数库组合
 GL + GLU + GLUT(跨平台)
  窗口控制GLUT,采用GLUT的消息处理机制
  图形绘制GL + GLU + GLUT中的绘制函数
 GL + GLU + WGL(仅限于Windows程序)
  窗口控制WGL,采用Windows的消息处理机制
  图形绘制GL + GLU + WGL中的绘制函数
入门阶段,最好是使用GLUT
编制较高级的Windows相关的绘制程序时,最好
使用WGL
OpenGL相关函数库(9/9)

函数库的使用方式
包含各个库的头文件
 程序中直接声明 include “*.h”
引用各个库的库文件
 在开发工具的工程设置中加入对 “*.lib” 的引用
将各个库的动态链接库放在系统目录(对于
Windows2000来说是“WINNTSystem32”目录)
下或者是程序的运行目录下
使用GLUT函数库(1/25)

创建窗口及初始化操作
回调函数(Callback function)
程序主循环
使用双缓存
绘制三维物体
一个简单的例子
使用GLUT函数库(2/25)

创建窗口及初始化操作
一共五个函数,一般在程序开始时连续调用
glutInit(int *argc, char **argv)
  初始化GLUT
glutInitDisplayMode(unsigned int mode)
  指定所创建窗口的特性,如,是RGBA模式还是颜
  色索引模式,单缓存模式还是双缓存模式,是否
  有深度缓存
使用GLUT函数库(3/25)

创建窗口及初始化操作
glutInitWindowPosition(int x, int y)
  窗口左上角在屏幕上的位置
glutInitWindowSize(int width, int size)
  窗口的尺寸,以屏幕像素为单位
int glutCreateWindow(char *string)
  创建OpenGL场景窗口,string是窗口名称,并返回
  一个新窗口的标识符
使用GLUT函数库(4/25)

回调函数(Callback function)
 回调函数是一个重要的概念,是GLUT的重要
 实现机制
 在Windows所提供的API和DirectX中,也有大
 量的回调函数
使用GLUT函数库(5/25)

回调函数(Callback function)
 回调函数由用户提供,但由系统(这里是
 GLUT)调用
 用户按照系统给定的格式提供回调函数
 系统通过注册函数给定回调函数的格式
 注册函数和回调函数一一对应,注册函数负
 责在系统中登记回调函数
使用GLUT函数库(6/25)

回调函数(Callback function)
 注册函数原型:
   RegisterFunc(Type (*func)(ParameterList))
   Type定义了回调函数的返回值类型
   ParameterList定义了回调函数的参数列表
 该注册函数对应的回调函数原型:
   Type func(ParameterList)
使用GLUT函数库(7/25)

使用回调函数
两个步骤:
 根据注册函数的格式,声明并定义回调函数
 在程序合适的地方,以回调函数名为参数调用注
 册函数
使用GLUT函数库(8/25)

常用的GLUT回调函数
 显示(Display)
 形状改变(Reshape)
 键盘(Keyboard)
 鼠标(Mouse)
 鼠标按键并移动(Motion)
 后台处理
使用GLUT函数库(9/25)

回调函数-显示(Display)
 注册函数
  void glutDisplayFunc(void (*func)(void))
 回调函数
  void func(void)
 窗口需要重新绘制时调用该回调函数
使用GLUT函数库(10/25)

重新绘制的显式激活函数
可以在程序中显式的激活绘制回调函数
void glutPostRedisplay(void)
使用GLUT函数库(11/25)

回调函数-形状改变(Reshape)
 注册函数
  void glutReshapeFunc(void (*func)(int width, int
  height))
 回调函数
  void func(int width, int height)
 窗口移动或者缩放时调用该回调函数
  参数width和height表示新的窗口大小
使用GLUT函数库(12/25)

回调函数-键盘(Keyboard)
 注册函数
  void glutKeyboardFunc(void (*func)(unsigned int key,
  int x, int y))
 回调函数
  void func(unsigned int key, int x, int y)
 按下生成ASCII字符的键时调用该回调函数
  key值是生成的ASCII字符
  x和y是当前鼠标位置
使用GLUT函数库(13/25)

回调函数-鼠标(Mouse)
 注册函数
  void glutMouseFunc(void (*func)(int button, int state, int x, int y))
 回调函数
  void func(int button, int state, int x, int y)
 按下或释放鼠标按键时调用该回调函数
  button表示是那一个鼠标键
  state表示鼠标键是按下还是释放
  x和y是当前鼠标位置
使用GLUT函数库(14/25)

回调函数-鼠标按键并移动(Motion)
 注册函数
  void glutMotionFunc(void (*func)(int x, int y))
 回调函数
  void func(int x, int y)
 按下一个或多个鼠标键并拖动鼠标时调用该
 回调函数
  x和y是当前鼠标位置
使用GLUT函数库(15/25)

回调函数-后台处理
注册函数
 void glutIdleFunc(void (*func)(void))
回调函数
 void func(void)
没有其它待处理的事件时,就执行该回调函
数,可以用来实现无需交互的连续动画处理
或进行其它后台处理
使用GLUT函数库(16/25)

程序主循环
void glutMainLoop(void)
初始化完成后,调用该函数,进入程序主循
环(即事件处理循环)
循环过程中,如果有键盘、鼠标、重绘等事
件,系统自动调用相应的回调函数,回调函
数结束后,程序自动返回主循环
使用GLUT函数库(17/25)

使用双缓存
以GLUT_DOUBLE为参数调用
glutInitDisplayMode,设置双缓存的窗口模式
在显示回调函数的最后调用glutSwapBuffers()
函数
使用GLUT函数库(18/25)

绘制三维物体
GLUT提供了一些复杂三维模型的绘制函数
每个三维模型都提供了两种绘制模式
 线框模式,仅显示模型的线框图
 实体模式,显示包括阴影效果的完整模型
使用GLUT函数库(19/25)

一个简单的例子-程序构成
由五个函数组成
 main函数,程序主入口、出口函数
 init函数,OpenGL自身内容初始化,如设定视点位
 置,设置投影矩阵等等
 mouse函数,响应鼠标消息的回调函数
 keyboard函数,响应键盘消息的回调函数
 display函数,响应重新绘制窗口消息的回调函数
使用GLUT函数库(20/25)

一个简单的例子-main函数
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
                                                    创建窗口及初始化操作
    glutInitWindowSize (250, 250);
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("hello");
    init ();                                        初始化 OpenGL 自身内容

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);                     注册各个回调函数

    glutMouseFunc(mouse);
    glutMainLoop();                                 进入程序主循环

    return 0;
}
使用GLUT函数库(21/25)

一个简单的例子-init函数
 简单初始化OpenGL自身
 void init (void)
 {
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
 }
使用GLUT函数库(22/25)

一个简单的例子-显示回调函数
 绘制一个矩形
 void display(void)
 {
   glClear (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();
   glutSwapBuffers();
 }
使用GLUT函数库(23/25)

一个简单的例子-键盘消息回调函数
 当按下“ESC”键时程序退出
 void keyboard(unsigned char key, int x, int y)
 {
   switch (key) {
     case 27:
       exit(0);
       break;
   }
 }
使用GLUT函数库(24/25)

一个简单的例子-鼠标消息回调函数
 当点击鼠标左键时程序退出
 void mouse(int button, int state, int x, int y)
 {
   switch (button) {
     case GLUT_LEFT_BUTTON:
           exit(0);
       break;
   }
 }
使用GLUT函数库(25/25)

一个简单的例子-通用模板
所有使用GLUT的OpenGL程序的模式都与本
例相似
 实现main函数,初始化OpenGL环境,调用init,注
 册各个回调函数,进入主循环
 实现init函数
 实现各个回调函数
OpenGL相关资源(1/2)

OpenGL官方网站
 http://www.opengl.org/
NVIDIA显卡厂商网上技术论坛
 http://developer.nvidia.com/page/home
ATI显卡厂商网上技术论坛
 http://www.ati.com/developer/
MSDN上关于OpenGL部分的帮助文档
 Platform SDK DocumentationGraphics and Multimedia
 ServicesOpenGL
OpenGL相关资源(2/2)

课程主页
OpenGL2.0 Specification
OpenGL state machine
GLUT开发包
GLUT3.0 Specification
红宝书电子版(英文)及源码
N.Robins的OpenGL教程

More Related Content

PPT
浅析Flash特效开发 陈勇
PPTX
Lectura Hamlet TIC
PDF
We Are Vi Creds Presentation
PPTX
Blackberry Scenario Analysis Presentation
PDF
#Digital #Education, il debutto: la nostra Storia per un Nuovo Inizio
PDF
Social Media ROI: from Useful to Youtility. Measuring heart, measuring respon...
PDF
Vuoi vendere? Aiuta! #SocialMediaROI è Responsabilità
浅析Flash特效开发 陈勇
Lectura Hamlet TIC
We Are Vi Creds Presentation
Blackberry Scenario Analysis Presentation
#Digital #Education, il debutto: la nostra Storia per un Nuovo Inizio
Social Media ROI: from Useful to Youtility. Measuring heart, measuring respon...
Vuoi vendere? Aiuta! #SocialMediaROI è Responsabilità

Viewers also liked (19)

PDF
Strategie di #SocialCare [e Resilienza] nel Community Management
PDF
Do You Want To Sell? Help!
PDF
Heart-Marketing, Help-Marketing: "Aiuto Dunque Vendo". #SocialCare, nuovo mod...
PDF
Vuoi vender un viaggio da sogno? Aiuta! Via App, robot o… il caro vecchio tel...
KEY
Property Forum - Sala Conferenze di Palazzo Marini, Camera dei Deputati
PDF
Heart-Marketing, Help-Marketing: "Aiuto Dunque Vendo": #SocialCare, Nuovo Mod...
PDF
L'Emozione Utile, L'Utile dell'Emozione: Webinar Trekksoft 27/9/16
PDF
Fare l'Utile con l'Utilità. #HelpMarketing, #SocialCare, Nuovo Modello di Bus...
PDF
"Comunico, Coinvolgo, Curo": le 3 C del Community Management
PDF
Come vendere un viaggio da sogno: vendi il Cuore, l'Emozione, un Customer Jou...
PDF
Aiuto, dunque vendo: l'era del Nuovo Marketing
PDF
"Comunico, Coinvolgo, Curo": #SocialCare, Le 3 C del Social Media Marketing
PDF
VHS vs Betamax - Listen to Customer
PDF
Analysis edition for olap
DOCX
Blackberry - Scenario Analysis
PDF
L'Attimo Utile - L'Utile dell'Attimo. Diverti responsabilmente (e vendi)
PDF
Influencer Marketing come Help-Marketing: «Aiuto Dunque Influenzo (e Vendo)»
PPTX
Building Enterprise Products - For Moving Targets of Customer Needs and Outcomes
PPT
Senior Design Capstone Presentation
Strategie di #SocialCare [e Resilienza] nel Community Management
Do You Want To Sell? Help!
Heart-Marketing, Help-Marketing: "Aiuto Dunque Vendo". #SocialCare, nuovo mod...
Vuoi vender un viaggio da sogno? Aiuta! Via App, robot o… il caro vecchio tel...
Property Forum - Sala Conferenze di Palazzo Marini, Camera dei Deputati
Heart-Marketing, Help-Marketing: "Aiuto Dunque Vendo": #SocialCare, Nuovo Mod...
L'Emozione Utile, L'Utile dell'Emozione: Webinar Trekksoft 27/9/16
Fare l'Utile con l'Utilità. #HelpMarketing, #SocialCare, Nuovo Modello di Bus...
"Comunico, Coinvolgo, Curo": le 3 C del Community Management
Come vendere un viaggio da sogno: vendi il Cuore, l'Emozione, un Customer Jou...
Aiuto, dunque vendo: l'era del Nuovo Marketing
"Comunico, Coinvolgo, Curo": #SocialCare, Le 3 C del Social Media Marketing
VHS vs Betamax - Listen to Customer
Analysis edition for olap
Blackberry - Scenario Analysis
L'Attimo Utile - L'Utile dell'Attimo. Diverti responsabilmente (e vendi)
Influencer Marketing come Help-Marketing: «Aiuto Dunque Influenzo (e Vendo)»
Building Enterprise Products - For Moving Targets of Customer Needs and Outcomes
Senior Design Capstone Presentation
Ad

Similar to Lecture 3 (18)

PDF
GPU通用计算调研报告
PPT
香港六合彩
PDF
Introduction to gpu architecture
PPTX
Baidu LSP and DISQL for Log Analysis
PPT
Hi Haskell
PPTX
從圖像辨識到物件偵測,進階的圖影像人工智慧 (From Image Classification to Object Detection, Advance...
PPT
信息系统开发平台OpenExpressApp
PDF
快速了解PostgreSQL
PPTX
An introduce to n hibernate (part 1) pub
PPT
Java Script 引擎技术
PPT
第01章 绪论(java版)
PPT
软件工程
PDF
移动开发的性能优化
PDF
Tcfsh bootcamp day2
PPTX
Interactive Data Language
PPT
Struts Mitac(1)
PDF
Starling
GPU通用计算调研报告
香港六合彩
Introduction to gpu architecture
Baidu LSP and DISQL for Log Analysis
Hi Haskell
從圖像辨識到物件偵測,進階的圖影像人工智慧 (From Image Classification to Object Detection, Advance...
信息系统开发平台OpenExpressApp
快速了解PostgreSQL
An introduce to n hibernate (part 1) pub
Java Script 引擎技术
第01章 绪论(java版)
软件工程
移动开发的性能优化
Tcfsh bootcamp day2
Interactive Data Language
Struts Mitac(1)
Starling
Ad

Lecture 3