页数:21页文件大小:100.8 KB来源: 计算机图形学ppt课件
本课件讲解Windows下OpenGL程序的基本结构:介绍基本库、实用库与辅助库三个函数库,通过sample.c说明头文件与语法规则,并按定义窗口、初始化、设置取景模式与配置运行环境拆解程序结构。
计算机图形学讲义 OpenGL2 基本程序结构
1 Windows 系统下的 OpenGL 函数
OpenGL 的基本库是 OpenGL 的核心函数库,在这个函数库中提供了 115 个函数,这些函数都是以“gl”为前缀。这类 API 的主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字处理等。
所有 OpenGL 提供的操作都可以使用这些函数来实现,而且对于不同的软件和硬件平台,这些函数的使用是完全相同的,这个特性注定了 OpenGL 程序完美的可移植性。
OpenGL 的实用库是 OpenGL 基本库的一套子程序,它提供了 43 个函数,这些函数都是以“glu”为前缀。基本的 OpenGL 不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,OpenGL 提供了实用库。主要功能包括绘制二次曲面、NURBS 曲线曲面、复杂多边形以及纹理、矩阵管理等。
实用库中的所有函数全都是由 OpenGL 基本库函数来编写的,所以在使用上和 OpenGL 基本库的使用是完全相同的。
OpenGL 的辅助库是为了方便用户用标准 C 编写 OpenGL 程序而编写的。OpenGL 是一个图形标准,在 OpenGL 中没有提供窗口管理和消息事件响应的函数,所以提供了辅助库。它提供了 31 个函数,这些函数都是以“aux”为前缀。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);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 ();}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); }把以上代码保存为 sample.c,在 VC 中建立工程并运行会出错,应先配置 OpenGL:
#pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "glaux.lib")2.3 语法规则
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 两个动态连接库。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}