首页计算机计算机图形学 05-2 OpenGL2 基本程序结构.pptx

05-2 OpenGL2 基本程序结构.pptx

页数:21页文件大小:100.8 KB来源: 计算机图形学ppt课件

本课件讲解Windows下OpenGL程序的基本结构:介绍基本库、实用库与辅助库三个函数库,通过sample.c说明头文件与语法规则,并按定义窗口、初始化、设置取景模式与配置运行环境拆解程序结构。

OpenGL第二章基本程序结构封面,标示本章围绕函数库、示例程序与程序结构展开
Windows环境说明页,说明操作系统与VC版本要求及OpenGL提供的基本库、实用库与辅助库
基本库说明页,说明115个以gl为前缀的核心函数覆盖的功能与跨平台可移植性
查看本课件的文字版(共 21 页,供检索与复制)

第1页:OpenGL2 基本程序结构

计算机图形学讲义 OpenGL2 基本程序结构

第2页:Windows系统下的OpenGL函数

1 Windows 系统下的 OpenGL 函数

  • Windows 95/98 以及 Windows NT 3.51 以上的操作系统中提供了 OpenGL 的动态库,在 VC++2.0 以上的版本中提供了 OpenGL 的静态库。
  • 在微机版本中,OpenGL 提供了三个函数库,它们是基本库、实用库和辅助库。

第3页:OpenGL基本库

OpenGL 的基本库是 OpenGL 的核心函数库,在这个函数库中提供了 115 个函数,这些函数都是以“gl”为前缀。这类 API 的主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字处理等。

所有 OpenGL 提供的操作都可以使用这些函数来实现,而且对于不同的软件和硬件平台,这些函数的使用是完全相同的,这个特性注定了 OpenGL 程序完美的可移植性。

第4页:OpenGL实用库

OpenGL 的实用库是 OpenGL 基本库的一套子程序,它提供了 43 个函数,这些函数都是以“glu”为前缀。基本的 OpenGL 不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,OpenGL 提供了实用库。主要功能包括绘制二次曲面、NURBS 曲线曲面、复杂多边形以及纹理、矩阵管理等。

实用库中的所有函数全都是由 OpenGL 基本库函数来编写的,所以在使用上和 OpenGL 基本库的使用是完全相同的。

第5页:OpenGL辅助库

OpenGL 的辅助库是为了方便用户用标准 C 编写 OpenGL 程序而编写的。OpenGL 是一个图形标准,在 OpenGL 中没有提供窗口管理和消息事件响应的函数,所以提供了辅助库。它提供了 31 个函数,这些函数都是以“aux”为前缀。OpenGL 辅助库提供了一些基本的窗口管理函数、事件处理函数和一些简单模型的制作函数等,例如定义窗口的大小、处理键盘事件、鼠标击键事件、绘制多面体等等。

第6页:一个简单的OpenGL程序

2 一个简单的 OpenGL 程序

例10.1 OpenGL 例程 sample.c

#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include <stdio.h> void myinit (void); void CALLBACK myReshape (int w, int h); void CALLBACK display (void);

第7页:初始化与绘图函数

void myinit (void){ glClearColor (0.0, 0.0, 0.0, 0.0);} void CALLBACK display (void) { glClear (GL_COLOR_BUFFER_BIT); glColor4f (0.2, 0.8, 1.0, 1.0); glRotatef (30, 1.0, 1.0, 0.0); auxWireCube (1.0); glFlush ();}

第8页:窗口处理与主函数

void CALLBACK myReshape (int w, int h){ glViewport (0, 0, w, h); } void main (void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 200, 200); auxInitWindow ("openglsample.c"); myinit (); auxReshapeFunc (myReshape); auxMainLoop (display); }

第9页:程序的运行环境配置

把以上代码保存为 sample.c,在 VC 中建立工程并运行会出错,应先配置 OpenGL:

  • 进入 Project 菜单,选 Settings 项,选 Link 项,在 Libraries 栏目中加入 OpenGL 库:opengl32.lib glu32.lib glaux.lib
  • 或者在代码里加入以下三句:
#pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "glaux.lib")

第10页:

第11页:头文件使用与回调函数

2.1 头文件使用
若应用程序使用 OpenGL 核心函数,应包括头文件 <GL/gl.h>;使用 GLU 库函数,应包括头文件 <GL/glu.h>;使用 AUX 库函数,应包括头文件 <GL/glaux.h>;使用 WGL 和 Win32 应包括头文件 <windows.h>。
2.2 回调(CALLBACK)函数
CALLBACK 函数是一些用来让系统调用的函数,系统调用它们来实现显示、接受输入事件功能。

第12页:OpenGL的语法规则

2.3 语法规则

  • OpenGL 基本库的所有操作函数都是以“gl”为前缀的。实用库的所有操作函数都是以“glu”为前缀。辅助库的所有操作函数都是以“aux”为前缀的。OpenGL 命令带有后缀。
  • 以 sample.c 中的 glColor4f 为例,前缀“gl”指这个函数是 OpenGL 的核心库函数,组成命令的单词首字母大写,如“Color”;后缀“4”表示颜色值是由 4 个变量来表示的;“f”表示所表示颜色的每个分量的类型为 32 位浮点数。
  • OpenGL 核心库函数常量是以“GL_”开头,均用大写字母,并用下划线将每个关键词分开,如 GL_COLOR_BUFFER_BIT。

第13页:程序基本结构:定义窗口

2.4 程序的基本结构

一个 OpenGL 程序的基本结构是很简单的,无论多么复杂的 OpenGL 程序,可以大致分解成以下部分:

(1)定义窗口:Windows 系统下的 OpenGL 实现提供了一个辅助函数库 aux,用于解决开窗口和处理输入事件等问题。窗口管理函数:首先调用 void auxInitDisplayMode (Glbitfield mask) 函数定义窗口的特性,如颜色和缓存区的性质。例如:

auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); 

第14页:窗口位置与打开窗口

其次,调用 void auxInitPosition (Glint x, Glint y, Glint width, Glint height) 定义窗口在屏幕上的位置和大小。其中 x、y 为窗口左上角的坐标,width、height 分别为窗口的宽和高(像素个数)。默认值为 (0,0,100,100)。例如:

auxInitPosition (0, 0, 200, 200); 

第15页:处理输入事件

处理输入事件:当改变窗口尺寸、移动窗口、重新显示窗口时,由 auxReshapeFunc (myReshape) 调用函数 myReshape 重新定义窗口属性。通常 myReshape 函数调用 glViewPort 函数,对当前图形进行裁剪,重新定义投影矩阵等。OpenGL 辅助函数库中还包括处理键盘和鼠标输入事件的函数。

第16页:初始化操作

(2)初始化操作

由于 OpenGL 的绘图方式是由一系列的状态确定的,因而在绘制图形前需要做一些准备工作,包括清缓存区(buffer)、定义光照模型、定义纹理映射等基本操作的初始化状态、设置三维视景体、定义视口。例如:

glClearColor (0.0, 0.0, 0.0, 0.0);glClear (GL_COLOR_BUFFER_BIT); 

第17页:设置取景模式与glViewport

(3)设置观察坐标系下的取景模式,主要利用了三个函数:

函数 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height):设置在屏幕上的视口大小,四个参数描述屏幕视口四个角上的坐标(以像素表示)。参数 (x, y) 用于指定视口的左下角在窗口坐标系中的位置,参数 width 和 height 分别确定矩形视口的宽和高,均以像素为单位。

注意:视口的大小和尺寸是在窗口坐标系中进行度量的,默认状态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小相同。

第18页:glOrtho正射投影

视点方向 观察体积

函数 void glOrtho (left, right, bottom, top, near, far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体。

注:在默认状态下投影方式为平行正交投影。

第19页:gluPerspective透视投影

函数 void gluPerspective (fovy, aspect, zNear, zFar):设置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。它通过指定 x-z 平面内的视角大小及宽高比来确定沿视线方向的棱锥,并通过指定远、近剪切面与视点间的距离来截断棱锥,得到观察体。

第20页:构造几何物体的数学描述

(4)使用 OpenGL 的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等。这是 OpenGL 程序的主要部分。在例10.1中,在函数 void CALLBACK display (void) 中写好要绘制的三维图形,然后,在主程序中调用 auxMainLoop (display) 就可让该图形一直显示。

第21页:微机运行环境配置

(5)程序的微机运行环境配置

  • 软件与硬件环境:操作系统 Windows 95/98、Windows NT;软件开发环境 Microsoft Visual C++ 4.0 及以上版本;硬件为奔腾级微机,最好配有支持 OpenGL 硬加速的图形卡。
  • 连接三个静态库:程序中除了包含必需的头文件如 <windows.h>、<GL/gl.h>、<GL/glaux.h>、<GL/glu.h> 外,在创建执行文件时,在 VC 环境设置中要连接 opengl32.lib、glu32.lib 和 glaux.lib 三个函数库。运行已创建的执行文件时,在 windows\system 目录下要有 opengl32.dll、glu32.dll 两个动态连接库。