《3-1计算机图形学_OpenGL教程-1.pdf》由会员分享,可在线阅读,更多相关《3-1计算机图形学_OpenGL教程-1.pdf(100页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 一 讲 基 本 概 念.21.1、OpenGL的 特 点 及 功 能.21.2、OpenGL工 作 流 程.41.3、W indow s中 OpenGL库 函 数 及 数 据 类 型.5第 二 讲 OpenGL中 的 二 维 编 程.102.1 一 个 简 单 的 示 例 程 序.102.2 GLUT.1 12.3.时 间 循 环 和 回 调 函 数.1 12.4.OpenGL中 的 颜 色 设 置.1 12.5.二 维 取 景.142.6.视 口 设 置.142.7.坐 标 系 与 变 换.142.8.较 完 整 的 程 序.142.9.基 本 图 元 的 绘 制.142 9 1、基 本
2、 图 元 的 描 述 及 定 义.142.9.2、OpenGL 中 的 颜 色.162.9.3、点(Point).202 9 5、多 边 形(Polygon).222 9 6、法 向 量 的 计 算 及 指 定.252 9 7、显 示 列 表.262.9.8、文 本.312.9.9、查 询 与 错 误.322.9.1 0,状 态 的 保 存.322.9.1 1,一 个 简 单 的 例 子.32第 三 讲.交 互 与 动 画.363.1、菜 单.363.2、键 盘 的 使 用.403.3、鼠 标 的 使 用.433.4、子 窗 口 与 多 窗 口.433.5、拾 取 和 选 择 模 式.443.
3、6、几 个 回 调 函 数.443.7、双 缓 存.44第 四 讲 三 维 编 程 基 础.44第 五 讲 坐 标 变 换.445.1 OpenGL中 的 三 维 物 体 的 显 示.445.2 OpenGL中 的 几 种 变 换.46第 六 讲 堆 栈 操 作.53第 七 讲?.56第 八 讲 使 用 光 照 和 材 质.56第 九 讲 纹 理 映 射.59第 十 讲 特 殊 效 果 操 作.63第 十 一 讲 曲 线 和 曲 面.7111.1、曲 线 的 绘 制.7211.2、曲 面 构 造.7511.3、图 元 逼 近 法 绘 制 三 维 物 体.79第 十 二 讲 绘 制 N U R
4、B S曲 线 和 曲 面.80第 十 三 讲 二 次 几 何 体.88第 十 四 讲 像 素 操 作.93第 十 五 讲 动 画 制 作.98OpenGL教 程 在 这 个 系 列 讲 座 中 介 绍 了 有 关 OpenGL的 基 本 知 识,主 要 涉 及 颜 色、绘 制 几 何 体、坐 标 变 换、堆 栈 操 作、显 示 列 表、光 照 和 材 质、纹 理 映 射、特 殊 效 果、曲 面 和 曲 线 的 绘 制、二 次 几 何 体 绘 制、像 素 操 作、如 何 绘 制 动 画 物 体 及 菜 单 管 理。通 过 对 讲 座 中 提 供 的 实 例 的 理 解 消 化,读 者 可 以 较
5、 容 易 地 进 入 OpenGL的 世 界。第 一 讲 基 本 概 念 前 言 随 着 计 算 机 多 媒 体 技 术、可 视 化 技 术 及 图 形 学 技 术 的 发 展,我 们 可 以 使 用 计 算 机 来 精 确 地 再 现 现 实 世 界 中 的 绚 丽 多 彩 的 三 维 物 体,并 充 分 发 挥 自 身 的 创 造 性 思 维,通 过 人 机 交 互 来 模 拟、改 造 现 实 世 界,这 就 是 目 前 最 为 时 髦 的 虚 拟 现 实 技 术。通 过 这 种 技 术,建 筑 工 程 师 可 以 直 接 设 计 出 美 观 的 楼 房 模 型;军 事 指 挥 员 可 以
6、 模 拟 战 场 进 行 军 事 推 演,网 民 可 以 足 不 出 户 游 览 故 宫 博 物 馆 等 名 胜 古 迹 等。而 虚 拟 现 实 技 术 最 重 要 的 一 部 分 内 容 就 是 三 维 图 形 编 程。当 前,三 维 图 形 编 程 工 具 中 最 为 突 出 的 是 SGI公 司 的 OpenGL(Open Graphics Language,开 放 式 的 图 形 语 言),它 已 经 成 为 一 个 工 业 标 准 的 计 算 机 三 维 图 形 软 件 开 发 接 口,并 广 泛 应 用 于 游 戏 开 发、建 筑、产 品 设 计、医 学、地 球 科 学、流 体 力
7、 学 等 领 域。值 得 一 提 的 是,虽 然 微 软 有 自 己 的 三 维 编 程 开 发 工 具 DirectX,但 它 也 提 供 OpenGL图 形 标 准,因 此,OpenGL可 以 在 微 机 中 广 泛 应 用。目 前,OpenGL在 国 内 外 都 掀 起 了 热 潮,但 国 内 对 这 一 领 域 介 绍 的 资 料 并 不 是 很 多,特 别 是 有 志 于 在 图 形 图 像 方 面 进 行 深 入 研 究 的 读 者 朋 友,常 常 苦 于 不 掌 握 OpenGL编 程 接 口 技 术,无 法 向 纵 深 领 域 扩 展。为 了 开 启 三 维 图 形 编 程 这
8、 扇 神 秘 大 门,本 讲 座 在 结 合 OpenGL有 关 理 论 知 识 的 基 础 上,着 重 介 绍 VisualC+6.0开 发 环 境 中 的 编 程 实 现,由 于 水 平 有 限,本 讲 座 可 能 无 法 面 面 俱 到,存 在 一 些 疏 漏,但 相 信 它 可 以 将 开 启 神 秘 大 门”的 钥 匙 交 给 读 者 朋 友 们。1.1、OpenGL的 特 点 及 功 能 OpenGL是 用 于 开 发 简 捷 的 交 互 式 二 维 和 三 维 图 形 应 用 程 序 的 最 佳 环 境,任 何 高 性 能 的 图 形 应 用 程 序,从 3D动 画、CAD辅 助
9、 设 计 到 可 视 化 访 真,都 可 以利 用 OpenGL高 质 量、高 性 能 的 特 点。OpenGL自 1992年 出 现 以 来,逐 渐 发 展 完 善,已 成 为 一 个 唯 一 开 放 的,独 立 于 应 用 平 台 的 图 形 标 准,一 个 典 型 的 OpenGL应 用 程 序 可 以 在 任 何 平 台 上 运 行-只 需 要 使 用 目 标 系 统 的 OpenGL库 重 新 编 译 一 下。OpenGL非 常 接 近 硬 件,是 一 个 图 形 与 硬 件 的 接 口,包 括 了 100多 个 图 形 函 数 用 来 建 立 三 维 模 型 和 进 行 三 维 实
10、 时 交 互。OpenGL强 有 力 的 图 形 函 数 不 要 求 开 发 人 员 把 三 维 物 体 模 型 的 数 据 写 成 固 定 的 数 据 格 式,也 不 要 求 开 发 人 员 编 写 矩 阵 变 换、外 部 设 备 访 问 等 函 数,大 大 地 简 化 了 编 写 三 维 图 形 的 程 序。例 如:1)OpenGL提 供 一 系 列 的 三 维 图 形 单 元(图 元)供 开 发 者 调 用。2)OpenGL提 供 一 系 列 的 图 形 变 换 函 数。3)OpenGL提 供 一 系 列 的 外 部 设 备 访 问 函 数,使 开 发 者 可 以 方 便 地 访 问 鼠
11、 标、键 盘、空 间 球、数 据 手 套 等 外 部 设 备。由 于 微 软 在 Windows中 包 含 了 OpenGL,所 以 OpenGL可 以 与 Visual C+紧 密 接 合,简 单 快 捷 地 实 现 有 关 计 算 和 图 形 算 法,并 保 证 算 法 的 正 确 性 和 可 靠 性。简 单 地 说,OpenGL具 有 建 模、变 换、色 彩 处 理、光 线 处 理、纹 理 影 射、图 像 处 理、动 画 及 物 体 运 动 模 糊 等 功 能:1、建 模 OpenGL图 形 库 除 了 提 供 基 本 的 点、线、多 边 形 的 绘 制 函 数 外,还 提 供 了 复
12、杂 的 三 维 物 体,如 球、锥、多 面 体、茶 壶 以 及 复 杂 曲 线 和 曲 面(例 如 Bezier、Nurbs等 曲 线 或 曲 面)的 绘 制 函 数。2、变 换 OpenGL图 形 库 的 变 换 包 括 基 本 变 换 和 投 影 变 换。基 本 变 换 有 平 移、旋 转、变 比、镜 像 四 种 变 换,投 影 变 换 有 平 行 投 影(又 称 正 射 投 影)和 透 视 投 影 两 种 变 换。3、颜 色 模 式 设 置 OpenGL颜 色 模 式 有 两 种,即 RGBA模 式 和 颜 色 索 引(Color Ind ex)。4、光 照 和 材 质 设 置 Open
13、GL 光 有 辐 射 光(Emitted L ig h t)、环 境 光(Ambient Light)漫 反 射 光(Diffuse Light)和 镜 面 光(Specular Light)0材 质 是 用 光 反 射 率 来 表 示。客 观 世 界 中 的 物 体 最 终 反 映 到 人 眼 的 颜 色 是 光 的 红 绿 蓝 分 量 与 材 质 红 绿 蓝 分 量 的 反 射 率 相 乘 后 形 成 的 颜 色。5、纹 理 映 射(Texture Mapping)利 用 OpenGL纹 理 映 射 功 能 可 以 十 分 逼 真 地 表 达 物 体 表 面 细 节。6、位 图 显 示 和
14、 图 象 增 强 OpenGL的 图 象 功 能 除 了 基 本 的 拷 贝 和 像 素 读 写 外,还 提 供 融 合(Blending)反 走 样(Antialiasing)和 雾(fo g)的 特 殊 图 象 效 果 处 理。以 上 三 条 可 是 被 仿 真 物 更 具 真 实 感,增 强 图 形 显 示 的 效 果。7、双 缓 存 动 画(Double Buffering)OpenGL使 用 了 前 台 缓 存 和 后 台 缓 存 交 替 显 示 场 景(Scene)技 术,简 而 言 之,后 台 缓 存 计 算 场 景、生 成 画 面,前 台 缓 存 显 示 后 台 缓 存 已 画
15、 好 的 画 面。8、特 殊 效 果 利 用 OpenGL还 能 实 现 深 度 暗 示(Depth C u e)、运 动 模 糊(Motion Blur)等 特 殊 效 果。运 动 模 糊 的 绘 图 方 式(motion-blured),模 拟 物 体 运 动 时 人 眼 观 察 所 感 觉 的 动 感 现 象。深 度 域 效 果(depth-of-effects),类 似 于 照 相 机 镜 头 效 果,模 型 在 聚 焦 点 处 清 晰,反 之 则 模 糊。这 些 三 维 物 体 绘 图 和 特 殊 效 果 处 理 方 式,说 明 OpenGL能 够 模 拟 比 较 复 杂 的 三 维
16、 物 体 或 自 然 景 观。1.2、OpenGL工 作 流 程 OpenGL的 基 本 工 作 流 程 如 下 图:如 上 图 所 示,几 何 顶 点 数 据 包 括 模 型 的 顶 点 集、线 集、多 边 形 集,这 些 数 据 经 过 流 程 图 的 上 部,包 括 运 算 器、逐 个 顶 点 操 作 等;图 像 数 据 包 括 象 素 集、影 像 集、位 图 集 等,图 像 象 素 数 据 的 处 理 方 式 与 几 何 顶 点 数 据 的 处 理 方 式 是 不 同 的,但 它 们 都 经 过 光 栅 化、逐 个 片 元(Fragment)处 理 直 至 把 最 后 的 光 栅 数
17、据 写 入 帧 缓 冲 器。在 OpenGL中 的 所 有 数 据 包 括 几 何 顶 点 数 据 和 象 素 数 据 都 可 以 被 存 储 在 显 示 列 表 中 或 者 立 即 可 以 得 到 处 理。OpenGL中,显 示 列 表 技 术 是 一 项 重 要 的 技 术。OpenGL要 求 把 所 有 的 几 何 图 形 单 元 都 用 顶 点 来 描 述,这 样 运 算 器 和 逐 个 顶 点 计 算 操 作 都 可 以 针 对 每 个 顶 点 进 行 计 算 和 操 作,然 后 进 行 光 栅 化 形 成 图 形 碎 片;对 于 象 素 数 据,象 素 操 作 结 果 被 存 储
18、在 纹 理 组 装 用 的 内 存 中,再 象 几 何 顶 点 操 作 一 样 光 栅 化 形 成 图 形 片 元。整 个 流 程 操 作 的 最 后,图 形 片 元 都 要 进 行 一 系 列 的 逐 个 片 元 操 作,这 样 最 后 的 象 素 值 送 入 帧 缓 冲 器 实 现 图 形 的 显 示。根 据 这 个 流 程,我 们 可 以 归 纳 出 在 OpenGL中 进 行 主 要 的 图 形 操 作 直 至 在 计 算 机 屏 幕 上 渲 染 绘 制 出 三 维 图 形 景 观 的 基 本 步 骤:1)根 据 基 本 图 形 单 元 建 立 景 物 模 型,并 且 对 所 建 立
19、的 模 型 进 行 数 学 描 述(OpenGL中 把:点、线、多 边 形、图 像 和 位 图 都 作 为 基 本 图 形 单 元)。2)把 景 物 模 型 放 在 三 维 空 间 中 的 合 适 的 位 置,并 且 设 置 视 点(viewpoint)以 观 察 所 感 兴 趣 的 景 观。3)计 算 模 型 中 所 有 物 体 的 色 彩,其 中 的 色 彩 根 据 应 用 要 求 来 确 定,同 时 确 定 光 照 条 件、纹 理 粘 贴 方 式 等。4)把 景 物 模 型 的 数 学 描 述 及 其 色 彩 信 息 转 换 至 计 算 机 屏 幕 上 的 象 素,这 个 过 程 也 就
20、 是 光 栅 化(rasterization)o在 这 些 步 骤 的 执 行 过 程 中,OpenGL可 能 执 行 其 他 的 一 些 操 作,例 如 自 动 消 隐 处 理 等。另 外,景 物 光 栅 化 之 后 被 送 入 帧 缓 冲 器 之 前 还 可 以 根 据 需 要 对 像 素 数 据 进 行 操 作。1.3、Windows中 OpenGL库 函 数 及 数 据 类 型(一)库 函 数 开 发 基 于 OpenGL的 应 用 程 序,必 须 先 了 解 OpenGL的 库 函 数。它 采 用 C语 言 风 格,提 供 大 量 的 函 数 来 进 行 图 形 的 处 理 和 显
21、示。OpenGL图 形 库 一 共 有 100多 个 函 数,它 们 分 别 属 于 OpenGL的 基 本 库、实 用 库、辅 助 库 等 不 同 的 库。1、核 心 库,包 含 的 函 数 有 115个,它 们 是 最 基 本 的 函 数,其 前 缀 是 gl;这 部 分 函 数 用 于 常 规 的、核 心 的 图 形 处 理,由 gl.dll来 负 责 解 释 执 行。核 心 库 中 的 函 数 可 以 进 一 步 分 为 以 下 几 类 函 数。(1)绘 制 基 本 几 何 图 元 的 函 数。glBegain()glEnd()glNormal*()glVertex*()0(2)矩 阵
22、 操 作、几 何 变 换 和 投 影 变 换 的 函 数。矩 阵 入 栈 函 数 glPushMatrix(),矩 阵 出 栈 函 数 glPopMatrix。,装 载 矩 阵 函 数 glLoadMatrix(),矩 阵 相 乘 函 数 glMultMatrix。,当 前 矩 阵 函 数 glMatrixMode()和 矩 阵 标 准 化 函 数 glLoadldentity。,几 何 变 换 函 数 glTrans山 te*()、gIRotate*。和 glScale*(),投 影 变 换 函 数 glOrtho。、glFrustum。和 视 口 变 换 函 数 glViewport。(3
23、)颜 色、光 照 和 材 质 的 函 数。如 设 置 颜 色 模 式 函 数 glColor*。、gllndex*()设 置 光 照 效 果 的 函 数 gILight*。、gILightModel*。和 设 置 材 质 效 果 函 数 glMaterial。等 等。(4)显 示 列 表 函 数。主 要 有 创 建、结 束、生 成、删 除 和 调 用 显 示 列 表 的 函 数 glNewList。、glEndList。、glGenLists()glCallList()和 glDeleteLists。等。(5)纹 理 映 射 函 数。主 要 有 一 维 纹 理 函 数 gITexImagel
24、D()二 维 纹 理 函 数 glTexlmage2D()设 置 纹 理 参 数、纹 理 环 境 和 纹 理 坐 标 的 函 数 glTexParameter*。、glTexEnv*()和 gITetCoord*。等。(6)特 殊 效 果 函 数。融 合 函 数 glBlendFunc()反 走 样 函 数 glHint。和 雾 化 效 果 gFog*()。(7)光 栅 化、象 素 操 作 函 数。像 素 位 置 gIRasterPos*。、线 型 宽 度 glLineWidth。、多 边 形 绘 制 模 式 glPolygonMode(),读 取 象 素 glReadPixel。、复 制 象
25、 蓑 glCopyPixel()等。(8)选 择 与 反 馈 函 数。主 要 有 渲 染 模 式 glRenderMode()选 择 缓 冲 区 glSelectBuffer。和 反 馈 缓 冲 区 glFeedbackBuffer。等。(9)曲 线 与 曲 面 的 绘 制 函 数。生 成 曲 线 或 曲 面 的 函 数 glMap*()、glMapGrid*(),求 值 器 的 函 数glEvalCoord*()glEvalMesh*()o(1 0)状 态 设 置 与 查 询 函 数。主 要 有 glGet*()、glEnable(),glGetError()等。2、实 用 库(OpenGL
26、 utility library,G L U),包 含 的 函 数 功 能 更 高 一 些,如 绘 制 复 杂 的 曲 线 曲 面、高 级 坐 标 变 换、多 边 形 分 割 等,共 有 4 3个,前 缀 为 glu。G lu函 数 通 过 调 用 核 心 库 的 函 数,为 开 发 者 提 供 相 对 简 单 的 用 法,实 现 一 些 较 为 复 杂 的 操 作。此 类 函 数 由 glu.dll来 负 责 解 释 执 行。主 要 包 括 了 以 下 几 种:(1)辅 助 纹 理 贴 图 函 数。W gluScalelmage()、gluBuildl Dmipmaps()gluBuild2
27、Dmipmaps()等。(2)坐 标 转 换 和 投 影 变 换 函 数。定 义 投 影 方 式 函 数 gluPerspective。、gluOrtho2D()gluLookAt(),拾 取 投 影 视 景 体 函 数 gluPickMatrix(),投 影 矩 阵 计 算 gluProject。和 gluUnProject。等。(3)多 边 形 镶 嵌 工 具。有 gluNewTess()gluDeleteTess()、gluTessCallback()、gluBeginPolygon()gluTessVertex。、gluNextContour()gluEndPolygon。等。(4)二
28、 次 曲 面 绘 制 工 具。主 要 有 绘 制 球 面、锥 面、柱 面、圆 环 面 gluNewQuadric。、gluSphere。、gluCylinder()gluDisk。、gluPartialDisk()gluDeleteQuadric。等 等。(5)非 均 匀 有 理 B样 条 绘 制 工 具。主 要 用 来 定 义 和 绘 制 Nurbs曲 线 和 曲 面,包 括 gluNewNurbsRenderer。、gluNurbsCurve()gluBeginSurface()gluEndSurface()gluBeginCurve。、gluNurbsProperty。等 函 数。(6)
29、错 误 反 馈 工 具。获 取 出 错 信 息 的 字 符 串 gluErrorString()o3 OpenGL 辅 助 库(OpenGL auxiliarylibrary,GLALIX),包 括 简 单 的 窗 口 管 理、输 入 事 件 处 理、某 些 复 杂 三 维 物 体 绘 制 等 函 数,共 有 3 1个,前 缀 为 auxo此 类 函 数 由 glaux.dll来 负 责 解 释 执 行。辅 助 库 函 数 主 要 包 括 以 下 几 类。(1)窗 口 初 始 化 和 退 出 函 数。auxlnitDisplayMode()和 auxlnitPosition()o(2)窗 口
30、处 理 和 时 间 输 入 函 数。auxReshapeFunc()auxKeyFunc。和 auxMouseFunc()o(3)颜 色 索 引 装 入 函 数。auxSetOneColor()o(4)三 维 物 体 绘 制 函 数。包 括 了 两 种 形 式 网 状 体 和 实 心 体,如 绘 制 立 方 体 auxWireCube()和 auxSolidCube()0这 里 以 网 状 体 为 例,长 方 体 auxWireBox。、环 形 圆 纹 面 auxWireTorus()圆 柱 auxWireCylinder。、二 十 面 体 auxWirelcosahedron。、八 面 体
31、auxWireOctahedron。、四 面 体 auxWireTetrahedron。、十 二 面 体 auxWireDodecahedron。、圆 锥 体 auxWireCone。和 茶 壶 auxWireTeapot。绘 制 实 心 体 只 要 将 上 述 函 数 中 的 确 Wire更 换 成 Solid”就 可 以 了。(5)其 他。背 景 过 程 管 理 函 数 auxldleFunc();程 序 运 行 函 数 auxMainLoop()o4、OpenGL 工 具 库(penGL Utility Toolkit)包 含 大 约 3 0多 个 函 数,函 数 名 前 缀 为 g l
32、u t,此 函 数 由 glut.dll来 负 责 解 释 执 行。这 部 分 函 数 主 要 包 括:(1)窗 口 操 作 函 数 窗 口 初 始 化、窗 口 大 小、窗 口 位 置 等 函 数 glutlnit()glutimtDisplayMode()、glutlnitWindowSize()glutlnitWindowPosition。等。(2)回 调 函 数。响 应 刷 新 消 息、键 盘 消 息、鼠 标 消 息、定 时 器 函 数 等,GlutDisplayFunc()glutPostRedisplay()x glutReshapeFunc。、glutTimerFunc()glut
33、KeyboardFunc()glutMouseFunc()o(3)创 建 复 杂 的 三 维 物 体。这 些 和 aux库 的 函 数 功 能 相 同。创 建 网 状 体 和 实 心 体。如 glutSol如 Sphere。、glutWireSphere()等。(4)菜 单 函 数创 建 添 加 菜 单 的 函 数 GlutCreateMenu。、glutSetMenu。、glutAddMenuEntry()glutAddSubMenu()和 glutAttachMenu。(5)程 序 运 行 函 数。glutMainLoop()o5、16个 W GL函 数,专 门 用 于 OpenGL和 W
34、indows窗 口 系 统 的 联 接,其 前 缀 为 w g l,主 要 用 于 创 建 和 选 择 图 形 操 作 描 述 表(renderingcontexts)以 及 在 窗 口 内 任 一 位 置 显 示 字 符 位 图。这 类 函 数 主 要 包 括 以 下 几 类(1)绘 图 上 下 文 相 关 函 数。wglCreateContext()wglDeleteContext()wglGetCurrentContent()wglGetCurrentDC()wglDeleteContent。等。(2)文 字 和 文 本 处 理 函 数。wglUseFontBitmaps。、wglUse
35、FontOutlines()o(3)覆 盖 层、地 层 和 主 平 面 层 处 理 函 数。wglCopyContext()x wgICreateLayerP山 ne()、wglDescribeLayerPlane()wgIReakizeLayerPI atte()等。(4)其 他 函 数。wglShareLists()wglGetProcAddress。等。6、另 外,还 有 五 个 Win32函 数 用 来 处 理 像 素 格 式(pixel form ats)和 双 缓 存。由 于 它 们 是 对 Win32系 统 的 扩 展,因 此 不 能 应 用 在 箕 它 OpenGL平 台 上。
36、(二)OpenGL数 据 类 型 与 C语 言 相 对 应,OpenGL中 也 有 整 数、字 节、浮 点 数 等 数 据 类 型,为 了 说 明 两 者 的 对 应 关 系,下 表 将 OpenGL的 数 据 类 型 与 相 应 的 C 类 型 进 行 了 对 比:表 一、OpenGL数 据 类 型 表 前 缀 数 据 类 型 相 应 C 语 言 类 型 OpenGL类 型 b 8-bit integer signed char GLbyteS 16-bit integer short GLshorti 32-bit integer long GLint,GLsizeif 32-bit fl
37、oating-point float GLfloat,GLclampfd 64-bit floating-point double GLdouble.GLclampdub 8-bit unsigned integer unsigned char GLubyte,GLbooleanUS 16-bit unsigned integer unsigned short GLushortui 32-bit unsigned integer unsigned long GLuint,GLenum,GLbitfield此 外,OpenGL也 定 义 GLvoid类 型,如 果 用 C 语 言 编 写,可 以
38、 用 它 替 代 void类 型。(三)OpenGL库 函 数 的 命 名 规 律 了 解 了 OpenGL的 数 据 类 型,让 我 们 再 回 过 头 来 看 看 OpenGL库 函 数 的 命 名 规 律。所 有 OpenGL函 数 采 用 了 以 下 格 式:库 前 缀 glx等 等,分 别 表 示 该 函 数 属 于 OpenGL某 开 发 库 等,从 函 数 名 后 面 中 还 可 以 看 出 需 要 多 少 个 参 数 以 及 参 数 的 类 型。I 代 表 in t型,f 代 表 float型,d 代 表 double型,u代 表 无 符 号 整 型。注 意,有 的 函 数 参
39、 数 类 型 后 缀 前 带 有 数 字 2、3、4o 2 代 表 二 维,3 代 表 三 维,4 代 表 alpha值(以 后 介 绍)。有 些 OpenGL函 数 最 后 带 一 个 字 母 v,表 示 函 数 参 数 可 用 一 个 指 针 指 向 一 个 向 量(或 数 组)来 替 代 一 系 列 单 个 参 数 值。下 面 两 种 格 式 都 表 示 设 置 当 前 颜 色 为 红 色,二 者 等 价。glColor3f(1.0Q.0Q.0);等 价 于:float color_array=1.0,0.0,0.0;glColor3fv(color_array);除 了 以 上 基 本
40、 命 名 方 式 外,还 有 一 种 带*星 号 的 表 示 方 法,例 如 glColor*。,它 表 示 可 以 用 函 数 的 各 种 方 式 来 设 置 当 前 颜 色。同 理,glVertex*v()表 示 用 一 个 指 针 指 向 所 有 类 型 的 向 量 来 定 义 一 系 列 顶 点 坐 标 值。第 二 讲 OpenGL中 的 二 维 编 程 任 何 复 杂 的 三 维 模 型 都 是 由 基 本 的 几 何 图 元:点、线 段 和 多 边 形 组 成 的,有 了 这 些 图 元,就 可 以 建 立 比 较 复 杂 的 模 型。因 此 这 部 分 内 容 是 学 习 Ope
41、nGL编 程 的 基 础。2.1 一 个 简 单 的 示 例 程 序#include void displayO(glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POLYGON);glVertex2f(-0.5,-0.5);glVertex2f(-0.5,0.5);glVertex2f(0.5,0.5);glVertex2f(0.5,-0.5);glEnd();glFlush();int main(int argc,char*argv)(glutlnit(&argc,argv);glutCreateWindow(simple)glutDisplayFunc(di
42、splay);glutMainLoopO;)程 序 运 行 结 果 为 一 个 矩 形:2.2 GLUTglut 是 OpenGL 的 跨 平 台 工 具 库 GLUTI全 称 为 OpenGL Utility Toolkit./I Mark J.K ilgard创 作 的 G L U T库,是 我 们 创 建 完 全 独 立 于 窗 口 系 统 的 O penG L程 序 成 为 可 能.感 谢 G L U T,我 们 能 够 在 不 了 解 X W indow s或 者 Microsoft W indow s窗 口 系 统 本 身 的 情 况 下 编 写 3 D应 用 程 序.K ilga
43、rd编 写 了 G LU T的 X W indow s版 本,后 来 Nate R obins又 将 之 移 植 到 Microsoft W indow s系 统 之 上.2.3.时 间 循 环 和 回 调 函 数 2.4.OpenGL中 的 颜 色 设 置 例 2:本 例 子 使 用 颜 色 引 索 模 式 绘 制 8 个 不 同 颜 色 的 球 体,如 图 二 所 示。阅 读 此 例 时,请 主 要 关 注 函 数 palette和 DrawColotFans。gllndex设 置 当 前 颜 色 索 引。参 数 为 当 前 颜 色 索 引。本 例 中 gllndexd函 数 的 参 数j
44、+1 对 应 palette 中 auxSetOneColor 函 数 中 的 i+1,auxSetOneColor 函 数 的 后 三 个 函 数 制 定 对 应 的 颜 色,颜 色 值 由 变 量 rgb83定 义。in clu d e in clu d e void init(void)(glClearColor(1.0,1.0,1.0,1.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_SMOOTH);void palette(void)|GLint i;static GLfloat rgb83=1,0,0,1,0,0.5,1,0,1,0
45、,0,1,0,1,1,0,1,0,1,1,0,1,0.5,0;for(i=0;i8;i+)(auxSetOneColor(i+1,rgb 皿 O,rgb 皿 1,rgbi2);设 置 颜 色 void DrawColorFans(void)(GLint j;glTranslatef(-15,-15,0);for(j=0;j8;j+)(gllndexd(j+1);设 置 当 前 颜 色 索 引/*在 不 同 位 置 绘 制 球 体*/glTranslatef(j,j-1,0);glutSolidSphere(1,20,20);void CALLBACK display(void)(palette
46、();DrawColorFans();glFlush();void CALLBACK reshape(GLsizei w,GLsizei h)|glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadldentity();gluPerspective(100,1,1,20);glMatrixMode(GL_MODELVIEW);glLoadldentity();glTranslatef(0,0,-15);void main()(auxlnitDisplayMode(AUX_SINGLE|AUX_INDEX);auxlnitPosition(1
47、00,100,500,500);auxlnitWindow(draw the color sphere);init();auxReshapeFunc(reshape);auxMainLoop(display);图 二:8 个 不 同 颜 色 的 球 体2 5 二 维 取 景 2 6 视 口 设 置 2 7 坐 标 系 与 变 换 2 8 较 完 整 的 程 序 2.9.基 本 图 元 的 绘 制 2.9.1、基 本 图 元 的 描 述 及 定 义 OpenGL图 元 是 抽 象 的 几 何 概 念,不 是 真 实 世 界 中 的 物 体,因 此 须 用 相 关 的 数 学 模 型 来 描 述。
48、所 有 的 图 元 都 是 由 一 系 列 有 顺 序 的 顶 点 集 合 来 描 述 的。OpenGL.中 绘 制 几 何 图 元,必 须 使 用 glBegain。和 glEnd()这 一 对 函 数,传 递 给 gBegain()函 数 的 参 数 唯 一 确 定 了 要 绘 制 何 种 几 何 图 元,同 时,在 该 函 数 对 中 给 出 了 几 何 图 元 的 定 义,函 数 glEnd()标 志 顶 点 列 表 的 结 束。例 如,下 面 的 代 码 绘 制 了 一 个 多 边 形:glBegin(GL_POLYGON);glVertex2f(0.0,0.0);glVertex2
49、f(0.0,3.0);glVertex2f(3.0,3.0);gIVertex2f(4.0,1.5);glVertex2f(3.0,0.0);glEnd();函 数 glBegin(GLenum mode)标 志 描 述 一 个 几 何 图 元 的 顶 点 列 表 的 开 始,其 参 数 mode表 示 几 何 图 元 的 描 述 类 型,具 体 类 型 见 表 一:表 一、几 何 图 元 类 型 说 明 类 型 说 明GL_POINTS 单 个 顶 点 集 GL_LINES 多 组 双 顶 点 线 段 GL_POLYGON单 个 简 单 填 充 凸 多 边 形 GL_TRAINGLES 多
50、组 独 立 填 充 三 角 形 GL_QUADS 多 组 独 立 填 充 四 边 形 GL_LINE_STRIP 不 闭 合 折 线 GL_LINE_LOOP 闭 合 折 线 GL_TRAINGLE_STRIP 线 型 连 续 填 充 三 角 形 串 GL_TRAINGLE_FAN 扇 形 连 续 填 充 三 角 形 串 GL_QUAD_STRIP 连 续 填 充 四 边 形 串 部 分 几 何 图 元 的 示 意 图:G L LINE L O O P G L Q I A D S G L QIAP STRIP图 一、部 分 几 何 图 元 示 意 图 在 glBegin。和 glEnd()之