没有合适的资源?快使用搜索试试~ 我知道了~
讲义
资源推荐
资源详情
资源评论
第一章 OpenGL 的基本框架
1.1 OpenGL 简介
在计算机发展初期,人们就开始从事计算机图形的开发,但直到 20 世纪 80 年代末 90
年 代 初 , 三 维 图 形 才 开 始 迅 速 发 展 。 于 是 各 种 三 维 图 形 工 具 软 件 包 相 继 推 出 , 如
GL,RenderMan 等,但没有一种软件包能够在三维图形建模能力和编程方便程度上与
OpenGL 相比拟。
OpenGL(Open Graphics Library,开放图形库),是一个三维的计算机图形和模型库 ,
它 源 于 SGI 公 司 为 其 图 形 工 作 站 开 发 的 IRIS GL , 在 跨 平 台 移 植 过 程 中 发 展 成 为
OpenGL。SGI 公司在 1992 年 6 月发布 1.0 版,后成为工业标准。目前,OpenGL 标准由
1992 年成立的独立财团 OpenGL Architecture Review Board(ARB)以投票方式产生,并制
成规范文档公布,各软硬件厂商据此开发自己系统上的实现。目前最新版规范是 1999 年 5
月通过的 1.2.1。
OpenGL 作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系
统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工
作,是专业图形处理、科学计算等高端应用领域的标准图形库。
OpenGL 在军事、广播电视、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世
界等领域都有着广泛的应用。它具有以下功能。
1. 模型绘制
OpenGL 能够绘制点、线和多边形。应用这些基本的形体,可以构造出几乎所有的三
维模型。OpenGL 通常用模型的多边形的顶点来描述三维模型。
2. 模型观察
在建立了三维景物模型后,就需要用 OpenGL 描述如何观察所建立的三维模型。观察
三维模型是通过一系列的坐标变换进行的。模型的坐标变换在使观察者能够在视点位置观
察与视点相适应的三维模型景观。在整个三维模型的观察过程中,投影变换的类型决定观
察三维模型的观察方式,不同的投影变换得到的三维模型的景象也是不同的。最后的视窗
变换则对模型的景象进行裁剪缩放,即决定整个三维模型在屏幕上的图象。
3. 颜色模式的指定
OpenGL 应用了一些专门的函数来指定三维模型的颜色。程序开发者可以选择二个颜
色模式,即 RGBA 模式和颜色表模式。在 RGBA 模式中,颜色直接由 RGB 值来指定;在
颜色表模式中,颜色值则由颜色表中的一个颜色索引值来指定。开发者还可以选择平面着
色和光滑着色二种着色方式对整个三维景观进行着色。
4. 光照应用
用 OpenGL 绘制的三维模型必须加上光照才能更加与客观物体相似。OpenGL 提供了
管理四种光(辐射光、环境光、镜面光和漫射光)的方法,另外还可以指定模型表面的反射
特性。
5. 图象效果增强
OpenGL 提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混
合和雾化来增强图象的效果。反走样用于改善图象中线段图形的锯齿而更平滑,混合用于
处理模型的半透明效果,雾使得影像从视点到远处逐渐褪色,更接近于真实。
6. 位图和图象处理
OpenGL 还提供了专门对位图和图象进行操作的函数。
1
7. 纹理映射
三维景物因缺少景物的具体细节而显得不够真实,为了更加逼真地表现三维景物 ,
OpenGL 提供了纹理映射的功能。OpenGL 提供的一系列纹理映射函数使得开发者可以十分
方便地把真实图象贴到景物的多边形上,从而可以在视窗内绘制逼真的三维景观。
8. 实时动画
为了获得平滑的动画效果,需要先在内存中生成下一幅图象,然后把已经生成的图象
从内存拷贝到屏幕上,这就是 OpenGL 的双缓存技术(double buffer)。OpenGL 提供了双缓
存技术的一系列函数。
9. 交互技术
目前有许多图形应用需要人机交互,OpenGL 提供了方便的三维图形人机交互接口,
用户可以选择修改三维景观中的物体。
1.2 OpenGL 的工作方式
1.2.1 OpenGL 的体系结构
OpenGL 是一套图形标准,它严格按照计算机图形学原理设计而成,符合光学和视觉
原理,非常适合可视化仿真系统。
由于 OpenGL 是一种 API,其中不包含任何窗口管理、用户交互或文件 I/O 函数。每个
主机环境(如 Microsoft Windows)在这些方面都有自己的函数,由这些函数负责实现某些
方法,以便把窗口或位图的绘制控制权移交给 OpenGL。通常,一个完整的窗口系统的
OpenGL 图形处理系统的结构如图 1.1 所示:最底层为图形硬件,第二层为操作系统,第三
层为窗口系统,第四层为 OpenGL,最上面的层为应用软件。
图 1.1 OpenGL 图形处理系统的层次结构
OpenGL 在 Windows NT 上的实现是基于客户机/服务器模式的,应用程序发出 OpenGL
命令,由动态链接库 OpenGL32.DLL 接受和打包后,发送到服务器端的 WINSRV.DLL,然
后由它通过 DDI(Device Driver Interface,设备驱动程序接口)层发往视频显示驱动程序。
如果系统安装了硬件加速器,则由硬件相关的 DDI 来处理。OpenGL/NT 的体系结构图如图
1.2 所示。
2
图 1.2 OpenGL/NT 体系结构
1.2.2 OpenGL 的流水线
当应用程序进行 OpenGL API 函数调用的时候,OpenGL 命令将被放在一个命令缓冲区
中,这样,命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当这个缓冲区被清空
时,缓冲区中的命令和数据都将传递给流水线的下一个阶段,或者说,只有当命令缓冲区
被清空时,OpenGL 命令才会被执行。图 1.3 显示了一条简化版的 OpenGL 流水线。
图 1.3 一条简化版的 OpenGL 流水线
在 OpenGL 中,命令缓冲区中的几何顶点数据通常还要进行几何变换以及光照计算,
并通过指定的方法进行投影,为下一步光栅化做准备。光栅化根据图形的几何形状、颜色
和纹理数据产生一系列图像的帧缓存地址和图元的二维描述值,光栅化的结果最后被放置
在帧缓存中。帧缓存是图形显示设备的内存,这样图像就显示在屏幕上了。
1.2.3 OpenGL 状态机
OpenGL 是一种直接模式的 API,每条命令根据当前的渲染状态都会产生某种立即效果。
渲染状态是各种标记,他们指出哪些特性是打开的,哪些是关闭的,以及应该如何应用他
们。在 OpenGL 中,使用 glEnable 函数和 glDisable 函数来启用和禁用渲染特征。
1.3 OpenGL 的操作步骤
在 OpenGL 中进行的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步
骤如下:
1. 根据基本图形单元建立景物模型,得到景物模型的数学描述(OpenGL 中把点、线、
多边形、图像和位图都作为基本图形单元);
2. 把景物模型放在三维空间中的合适的位置,并且设置视点(Viewpoint)以观察所感兴
趣的景观;
3. 计算模型中所有物体的色彩,同时确定光照条件、纹理粘贴方式等;
4. 把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素,这个过程也就是
光栅化(rasterization)。
3
在这些步骤的执行过程中,OpenGL 可能执行其他的一些操作,例如自动消隐处理等。
另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。
1.4 OpenGL 的组成
OpenGL 不是一种编程语言,而是一种 API(应用程序编程接口),它实际上是一种图
形与硬件的接口,包括了多个图形函数。OpenGL 主要由以下函数库组成。
1. OpenGL 核心库
OpenGL 核心库中包含了 115 个最基本的命令函数,它们都是以“gl”为前缀,可以在任
何 OpenGL 的工作平台上应用。这部分函数用于常规的、核心的图形处理,如建立各种各
样的几何模型,产生光照效果,进行反走样以及进行纹理映射,以及进行投影变换等等。
由于许多函数可以接收不同数据类型的参数,因此派生出来的函数原形有 300 多个。
2. OpenGL 实用程序库
OpenGL 的实用程序库包含有 43 个函数,以“glu”为前缀,在任何 OpenGL 平台都可以
应用。这部分函数通过调用核心库的函数,来实现一些较为复杂的操作,如纹理映射、坐
标变换、网格化、曲线曲面以及二次物体(圆柱、球体等)绘制等。
3. OpenGL 编程辅助库
OpenGL 的辅助库包含 31 个函数,以“aux”为前缀,但它们不能在所有的 OpenGL 平台
上使用。OpenGL 的辅助库的函数主要用于窗口管理、输入输出处理以及绘制一些简单的
三维形体。
4. OpenGL 实用程序工具包
OpenGL 实用程序工具包(OpenGL utility toolkit,GLUT)包含 30 多个函数,函数名
前缀是“glut” 。其中的函数主要提供基于窗口的工具,如窗口系统的初始化,多窗口管理,
菜单管理,字体以及一些较复杂物体的绘制等。由于 glut 库中的窗口管理函数是不依赖于
运行环境的,因此 OpenGL 中的工具库可以在所有的 OpenGL 平台上运行,在后面的示例
中,我们均使用 glut 库建立 OpenGL 程序运行框架。
5. Windows 专用库
Windows 专 用 库 函 数 包 含 有 6 个 , 每 个 函 数 以 wgl 开 头 , 用 于 连 接 OpenGL 和
Windows NT,这些函数用于在 Windows NT 环境下的 OpenGL 窗口能够进行渲染着色,在
窗口内绘制位图字体以及把文本放在窗口的某一位置等这些函数把 Windows 和 OpenGL 揉
合在一起。
6. Win32 API 函数库
这部分函数没有专用的前缀,主要用于处理像素存储格式和双帧缓存。
1.5 OpenGL 的数据类型
由于 OpenGL 具有平台无关性,它定义了自己的数据类型,这些数据类型将映射为常
规的 C 数据类型,在程序中也可以直接使用这些 C 数据类型,下表列出了在 OpenGL 中定
义的数据类型。
表 1-1 OpenGL 变量类型和相应的 C 数据类型
OpenGL 数据类型 内部表示法 定义为 C 类型
C 字面值后
缀
GLbyte
8 位整数
signed char b
GLshort
16 位整数
short s
GLint,GLsizei 32 位整数
song l
GLfloat,GLclampf 32 位浮点数
float f
GLdouble,GLclampd 64 位浮点数
double d
GLubyte,GLboolean 8 位无符号整数
unsigned char ub
4
GLshort
16 位无符号整数
unsigned short us
GLuint,GLenum,GLbitfiel
d
32 位无符号整数
unsigned long ui
1.6 OpenGL 函数命名约定
OpenGL 函数都遵循一个命名约定,通过这个约定可以了解函数来源于哪个库,需要
多少个参数以及参数的类型。每一个函数都有一个根段,代表该函数相应的 OpenGL 命令。
所有的 OpenGL 函数都采用以下格式:
<库前缀><根命令><可选的参数个数><可选的参数类型>
例如函数 glColor3f(…),gl 表示这个函数来自库 gl.h,color 是该函数的根段,表示该
函数用于颜色设定,3f 表示这个函数采用了三个浮点数参数。这种把参数数目和参数类型
加入 OpenGL 函数结尾的约定使人们更容易记住参数列表而无需查找它。
1.7 用 OpenGL 绘制图形
由于 OpenGL 是一种 API,OpenGL 库遵循 C 调用约定,这意味着在 C 语言中编写的程
序可以很容易地调用 API 中的函数,本书的示例程序均以 C 语言编写。下面的程序利用
GLUT 库,在窗口的中心位置绘制一个矩形,其输出如图 1.4 所示。
程序清单 1.1:在窗口内绘制一个矩形
//GLRect.c
#include <windows.h>
#include <gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>
// 函数 RenderScene 用于在窗口中绘制需要的图形
void RenderScene(void)
{
//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glClear(GL_COLOR_BUFFER_BIT);
//设置当前绘图使用的 RGB 颜色
glColor3f(1.0f, 0.0f, 0.0f);
//使用当前颜色绘制一个填充的矩形
glRectf(100.0f, 150.0f, 150.0f, 100.0f);
//刷新 OpenGL 命令队列
glFlush();
}
5
剩余63页未读,继续阅读
资源评论
古月今犹在
- 粉丝: 29
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功