图形学实验指导书2009(1)

更新时间:2023-03-18 17:09:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

图形学实验指导书

OpenGL简介

一、OpenGL概述

OpenGL是图形硬件的一个软件接口(GL代表图形库,Graphics Library)。使用OpenGL,可以对计算机图形技术进行控制,产生逼真的现实世界的图象或虚拟的现实世界所没有的图象。OpenGL包括了大约250个不同的函数,程序员可以用这些函数指定物体和操作,创建交互性三维应用程序,而不必为许多应用程序中通用的标准函数编写代码,同时使应用程序避免接触过多的硬件细节。

OpenGL主要关注图象的渲染,即根据几何图形对象的规范及其属性,使用虚拟的照相机和光源来构成一幅图象。OpenGL是跨平台的一种应用程序接口(Application Programmer's Interface, API),因此不包含输入和视窗操作。对于视窗管理,我们选用OpenGL应用工具包GLUT(OpenGL Utility Toollkit)。

二、OpenGL的组成

在微机版本中,OpenGL主要由三个函数库组成,它们是核心库、实用函数库和编程辅助库。

OpenGL的核心库包含了OpenGL最基本的命令函数。在这个库中,提供了一百多个函数,这些函数的函数名都以“gl”为前缀。这些函数用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等几乎所有的二维和三维图形操作。这一百多个基本函数由于使用各自不同的参数而导致格式的变形,派生出数百个命令。而且,对于不同的硬件和软件平台,这些函数的使用是完全相同的,这个特性决定了OpenGL的可移植性。

OpenGL的核心库提供了创建基本几何图元的函数,通过基本几何图元的各种组合创建其它几何模型,几何模型也可称为物体。为了减少编程负担,OpenGL实用函数库提供了40多个创建常用的几何对象函数,立方体、二次曲面等。OpenGL实用库中函数的函数名以“glu”为前缀,所有函数都是利用核心库中函数编写,使用方法和核心库中函数的使用方法相同。

由于OpenGL是一个图形标准,独立于任何操作系统和窗口系统,OpenGL中没有提供窗口管理和消息事件响应的函数,也没有从鼠标和键盘读取事件的功能。因此,在不同的操作系统都设计OpenGL了额外的编程辅助库 提供一些基本的窗口管理函数、事件处理函数,例如定义窗口的大小、处理键盘和鼠标事件等。Windows操作系统下的编程辅助库中函数的函数名以“aux”为前缀。这些编程辅助库是依赖于具体操作系统的,为了支持跨平台,SGI公司的Mark Kilgard编写了GLUT,GLUT中函数的函数名以“glut”为前缀。现在,在Windows操作系统GLUT已经取代了AUX库。

三、OpenGL的功能

1、根据几何图元创建形状,建立物体的几何模型。OpenGL中包括两种图元:几何图元和图象图元。几何图元包括:点、直线段、三角形、四边形和多边形,这些图元通过顶点指定。图象图元,例如位图。

2、在三维空间中排列物体,并选择观察复合场景的有利视角;

3、计算所有物体的颜色。颜色可以由应用程序明确指定,也可以根据特定的光照条件来确定,或通过把纹理表面贴到物体表面得到。

4、把物体的数学描述以及和它们相关的颜色信息转换为屏幕上的像素。

四、基于C语言和OpenGL的图形程序开发基础

图形学实验指导书

1、基于C语言和OpenGL的图形程序结构:根据需要在C语言程序中嵌入OpenGL命令。 2、程序中一般包括以下三个部分: (1)应用程序初始化; (2)生成并绘制图象;

(3)main函数中调用(1)和(2)中的函数。 3、OpenGL命令格式和数据类型

OpenGL命令就是OpenGL中的函数调用,命令名称就是函数名,命令中的参数就是函数调用所需的参数。

OpenGL函数命名约定:函数名饿头几个字母说蜜柑内该函数来自哪个库,后面部分包含一个根命令,一般是一个英文单词(第一个字母必须大写),表示该函数的功能,后缀中的数字和字母分别表示参数的个数和类型。例如:

命令glColor3f(1.0,1.0,1.0);

前缀“gl”表示该函数属于核心库,“Color”表示该命令的功能为着色,“3f”表示该命令有三个参数,参数类型为浮点数,(1.0,1.0,1.0)是函数调用时的具体参数,最后的分号“;”是C语言格式中所要求的。如果OpenGL命令的后缀有一个字母“v”,表示该命令有一个指向矢量或数组的指针参数,例如:

GLfloat color[ ]={1.0,1.0,1.0}; //说明一个浮点型的数组color,GLfloat是数据类型 glColor3fv(color); //数组color 作为参数

OpenGL命令中的参数个数可能使个、3个或4个,参数类型见下表:

4、OpenGL中定义的符号常量

OpenGL中的符号常量,以大写字母GL_或GL_开头,表示属于哪个库,所有字母都大写,单词之间用下划线连接。例如,GL_COLOR_BUFFER_BIT,表示颜色缓冲区。 5、头文件gl.h、glu.h和glut.h

OpenGL核心库的函数、类型和宏(符号常量)的原型包括在头文件gl.h中,实用函数库的原型包括在头文件glu.h中,应用工具包GLUT的原形4包括在头文件glut.h中。

OpenGL是一个标准的程序库,Windows系统运行OpenGL程序,需要在windows\system32文件夹包含动态连接库opengl32.dll和glu32.dll,使用GLUT的用户还需要包含动态连接库glut32.dll。编译OpenGL程序需要有头文件gl.h和glu.h,使用GLUT的用户需要头文件glut.h,因为glut.h包括了gl.h和glu.h,所以仅用glut.h即可;还需要库文件opengl32.lib、glu32.lib和glut32.lib。

图形学实验指导书

五.OpenGl命令 命令:glClearColor

函数原型:void glClearColor(GLclampf red,GLclampf green,GLclampf blue, GLclampf alph);

功能:将缓存的当前清楚颜色设置为给定的颜色值(red,green,blue,alpha); 参数:(red,green,blue)指定RGB颜色空间的一个颜色值,alpha指定透明度。 命令:glClear

函数原型:void glClear(GLbitfield mask);

功能:用当前的清楚值清楚1种或多种缓冲区。

参数:mask指定需要清除的缓冲区。缓冲区对应的mask值见表1.1。如果需要 同时清除多种缓冲区,则将表中的多个值通过逻辑或(|)组合在一起表 示msk值。例如:同时清除颜色缓冲区和深度缓冲区。

mask=GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT。 命令:glColor3f

函数原型:void glColor3f(GLfloat red,GLfloat green,GLfloat blue);

功能:将当前的颜色值设置为指定的RGBA模式颜色值(red,green,blue,1.0f), 其中1.0f为默认的混合因子数值。 参数:(red,green,blue),指定颜色值的R、G、B三个分量每个分量的取值范围 均为区间[0.0,1.0]。 命令:SwapBuffers

函数原型:Bool SwapBuffers(HDC hdc); 功能:交换缓冲区,将绘制完成的缓存图像显示在屏幕上。要求采用双缓存机制。 参数:hdc指定设备上下文。

返回值:如果函数执行成功,返回TRUE,否则,返回FALSE。 命令:glOrtho

函数原型:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom, GLdouble top,GLdouble zNear,GLdouble zFar); 功能:产生正平行投影变换矩阵。

参数:left、right分别为裁剪矩形体的左、右侧两个裁剪平面的X轴坐标值。 bottom、top分别为裁剪矩形体的底、顶端两个裁剪平面的Y轴坐标值。 (-zNear)、(-zFar)分别为裁剪矩形体的近、远端两个裁剪平面的 Z轴坐标值。 命令:glFrustum

函数原型:void glFrustum(GLdouble left,GLdouble right,GLdouble bottom, GLdouble top,GLdouble zNear,GLdouble zFar); 功能:产生透视投影变换矩阵。 参数:left、right分别为裁剪四棱台上底面矩形的左、右侧两条边的X轴坐标值。 bottom、top分别为裁剪四棱台上底面矩形底、顶端两条边的Y轴坐标值。 (-zNear)、(-zFar)分别为裁剪矩形体的近、远端两个裁剪平面的 Z轴坐标值。 命令:gluPerspective

函数原型:void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble zNear,GLdouble zFar); 功能:产生对称透视投影变换矩阵。

图形学实验指导书

参数:fovy裁剪四棱台在Y方向上的两个侧面夹角的度数,0<fovy<180。 aspect裁剪四棱台上底面 命令:glViewport

函数原型:void glViewport(GLint x0,GLint y0,GLsizei width,GLsizei height); 功能:产生视口变换,将在三维空间中可以显示在屏幕上的点映射到视口中。 参数:x0,y0 视口左下角点在视图窗口坐标下的坐标值; width 视口的宽度; height 视口的高度。 命令:glVertex3d

函数原型:void glVertex3d(GLdouble x,GLdouble y,GLdouble z);

功能:用在一对函数glBegin和glEnd之间,用来指定一个顶点的坐标值。 参数:x,y,z 顶点坐标的三个分量。 命令:glBegin和glEnd

函数原型:void glBegin(GLenum mode); void glEnd(void);

功能:函数glBegin和glEnd 共同组成一个函数对。在函数glBegin和glEnd之 间的语句定义了一个或一组图形元素的顶点坐标、颜色和法向量等信息。 同时函数glBegin的参数mode 指定图形元素的类型。

参数:mode 指定图形元素的类型。参数mode 所有可能取值及其含义如下: GL_POINTS:要求在glBegin和glEnd之间至少包含一个顶点,每个顶点 都是孤立的点。

GL_LINES:要求在glBegin和glEnd之间至少包含两个顶点,如果有2n 个顶点,生成n条直线段。

GL_LINE_LOOP:要求在glBegin和glEnd之间至少包含两个顶点,依次 相连生成一个封闭的环。

GL_LINE_STRIP:要求在glBegin和glEnd之间至少包含两个顶点,依次 相连生成一条折线段。

GL_TRIANGLES:要求在glBegin和glEnd之间至少包含三个顶点,如果 有3n个顶点,生成n个三角形。

GL_TRIANGLE_STRIP:要求在glBegin和glEnd之间至少包含三个顶点, 如果有n个顶点,生成(n-2)个三角形组成的带。 GL_TRIANGLE_FAN:要求在glBegin和glEnd之间至少包含三个顶点, 如果有n个顶点,生成(n-2)个三角形组成的扇。 GL_QUADS:要求在glBegin和glEnd之间至少包含四个顶点,如果 有4n个顶点,生成n个四边形。

GL_QUAD_STRIP:要求在glBegin和glEnd之间至少包含四个顶点, 如果有n个顶点,生成(n-1)个四边形组成的带。 GL_POLYGON:要求在glBegin和glEnd之间至少包含三个顶点,对于n 个顶点,一次相连组成一个多边形。

图形学实验指导书

图形学实验指导书

实验一

实验目的:熟悉VC++控制台编程环境,掌握基于C语言的OpenGL编程结构。 实验内容:

1.GLUT工具包的安装;

2.基于VC++控制台的C语言编程;

3.VC++控制台编程环境与OpenGL的连接; 4.基于VC++控制台的OpenGL编程;

实验过程:

一.阅读以下程序,掌握基于C语言的OpenGL编程结构: 1.源程序

#include <windows.h> #include <gl/glut.h>

void display(void) {

glClearColor(0.0f,0.0f,1.0f,1.0f);

glClear(GL_COLOR_BUFFER_BIT); glFlush(); }

void main(int &argc,char **argv) {

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("hello"); glutDisplayFunc( display); displayMainLoop(); }

2.程序内容理解 (1) 两个包含文件

#include <windows.h> 包含了windows环境下编程所需要的信息。 #include <gl/glut.h> 包含了OpenGL编程所需要的信息。 (2) main函数

glutInit(&argc,argv); 初始化GLUT库,使系统识别GLUT库中的命令。

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 告诉GLUT库在创建窗口时使用的显示模式和颜色模型,其中参数GLUT_SINGLE指定单缓冲显示模式,绘图命令在用于显示的窗口执行。参数GLUT_RGB指定RGBA颜色模型。单缓冲显示模式不能做动画,第一个参数的另一种选择是GLUT_DOUBLE,指定双缓冲显示模式,可以作动画。第二个参数的其它选择现在不常用,RGBA颜色模型通过设置红、绿,、三种颜色的成分来确定颜色。

图形学实验指导书

glutCreateWindow("hello"); 创建应用程序窗口,参数指定窗口标题。 glutDisplayFunc( display); 通过调用用户程序绘制图形。

displayMainLoop(); 只能放在main函数的最后,所有已经创建的窗口将在此时显示,对创建窗口的绘制开始生效,事件处理开始启动。

(3)display函数

glClearColor(0.0f,0.0f,1.0f,1.0f); 设置颜色缓冲区的颜色为蓝色,即设置背景色, 参数(0.0f, 0.0f, 1.0f, 1.0f)指定颜色中 红、绿、蓝的成分,每个成分在0~1(伙伴0~255)之间取值;最后一个参数指定是否透明,0表示透明,1表示不透明。

glClear(GL_COLOR_BUFFER_BIT); 用glClearColor命令指定的颜色清除颜色缓冲区中原来的颜色,参数GL_COLOR_BUFFER_BIT代表颜色缓冲区。

glFlush(); 用于刷新OpenGL中的命令队列,使所有未被执行OpenGL命令得到执行。由于OpenGL内部使用渲染(绘图)流水线的顺序处理命令,OpenGL的命令常常会排队并成批处理,以便优化性能。glFlush函数告诉OpenGL应该处理到目前为止收到的命令。命令glFinish();除了具有glFlush()的功能外,还等待图形硬件和网络的响应,但是性能没有glFlush()高。 3.运行程序

(1) 安装GLUT工具包(只需一次):先下载,解压。 解压后包含三个文件:glut.h,glut32.lib,glut32.dll。 安装过程:

* 将glut32.dll复制到Windows系统的system32文件夹中; * 将glut32.lib复制到VC的lib文件夹中; * 将glut.h复制到VC的include\GL文件夹中。 (2)启动VC++,创建基于控制台的程序框架 * 启动VC++

(3)设置OpenGL编程环境

* 在应用程序窗口,选择“Project”→“Settings”→“Link”

* 在“Object/Library Modules”一栏中加入:opengl32.Lib、glu32.Lib、glut32.Lib,两个文件名以及与原有内容之间用空格间隔。 (4)运行程序 * 输入代码;

* 编译和连接:在应用程序窗口,选择“Build”→“Compile”或“Build”。 * 运行:在应用程序窗口,选择“Build”→“Execute”或工具栏按钮“!”执行程序。 (5)编译、修改

* 窗口最下方显示编译和连接信息,如果编译出错,双击错误信息,系统自动定位到程序中的出错语句,修改后再次编译。

4.程序运行结果:该程序仅创建一个系统默认的应用程序窗口。 5.保存

在应用程序窗口,选择“save Project”

6修改display函数中的glClearColor命令中参数,观察应用程序窗口的颜色变化。 7.清除程序(内存)

在应用程序窗口,选择“Clear Project”

图形学实验指导书

二.阅读以下程序,掌握应用程序窗口参数的设置和渲染对象的颜色设置(前景色) 1.源程序

#include <windows.h> #include <gl/glut.h>

void init() {

glClearColor(0.0,0.0,1.0,1.0); }

void display(void) {

glClear(GL_COLOR_BUFFER_BIT); glColor4f(0.0,1.0,1.0,1.0); glRotatef(60,1.0,1.0,1.0); glutWireCube(0.8); glFlush(); }

void main(int &argc,char **argv) {

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(200,200); glutInitWindowPosition(100,100); glutCreateWindow("cube"); init();

glutDisplayFunc( display); glutMainLoop(); }

2.程序内容理解 (1)main函数

glutInitWindowSize(200,200); 设置应用程序窗口的大小,参数表示宽和高。

glutInitWindowPosition(100,100); 设置应用程序窗口的位置,参数表示窗口的左上角坐标。

(2)init函数

init函数设置应用程序的初始化,其中包括应用程序启动时执行的代码,并且往往只执行一遍。因为颜色缓冲区的颜色设置不经常变化,所以将其放入init函数中。从main函数中的调用次序可以看出,与程序一中代码的写法没有本质区别。 (3)display函数

glColor4f(0.0,1.0,1.0,1.0); 设置渲染对象的颜色,其中参数(0.0,1.0,1.0,1.0)的含义和解释与glClearColor(0.0f,0.0f,1.0f,1.0f); 相同。

glRotatef(60,1.0,1.0,1.0); 将绘制图象旋转60度。

图形学实验指导书

参数(60, 1.0, 1.0, 1.0)表示(旋转角度,x轴,y轴,z轴)。

其中,对应x轴、y轴、z轴的数值,如果为1表示饶该轴旋转,为0表示不饶该轴旋转。

glutWireCube(0.8); 绘制一个边长为0.8的线框(Wire)立方体(Cube)。 3.运行、保存和清除程序同程序一。 4. 观察并分析程序运行结果。 5.修改程序

(1)修改立方体的颜色; (2)修改立方体的旋转角度;

(3)修改应用程序窗口的大小和在屏幕显示位置。

三.glutWireCube(GLdouble size);绘制GLUT中的三维物体 1.GLUT中的三维物体:

命令中“Solid”表示实心物体,“Wire”图形。下面仅给出函数原型,命令的使用利用C语言知识调用。 (1)立方体

函数原型:glutWireCube(GLdouble size); glutSolidCube(GLdouble size);

功能:绘制一个边长为siaze的立方体,立方体中心位于原点。 参数说明:size为立方体的边长。 (2)圆锥体

数原型:glutWireCone(GLdouble base,GLdouble height,GLint slices,GLint stacks); glutSolidCone(GLdouble base,GLdouble height,GLint slices,GLint stacks);

功能:绘制一个圆锥体,圆锥底面中心位于坐标原点(0,0,0),圆锥顶点位于z轴上。 参数说明:base圆锥底面半径,height圆锥高。

slices环绕z轴的剖面数,stacks沿着z轴的剖面数。 (3)正十二面体

函数原型:glutWireDodecahedron(void); glutSolidDodecahedron(void);

参数说明:没有参数。 (4)正二十面体

函数原型:glutWireIcosahedron(void); glutSolidIcosahedron(void);

功能:绘制一个正二十面体,中心位于原点,半径为1。 参数说明:没有参数。 (5)

函数原型:glutWireOctahedron(void); glutSolidOctahedron(void);

功能:绘制一个正八面体,中心位于原点,半径为1。

参数说明:没有参数。 (6)

函数原型:glutWireSphere(GLdouble radius,GLint slices,GLint stacks);

图形学实验指导书

glutSolidSphere(GLdouble radius,GLint slices,GLint stacks); 功能:绘制一个球体,球体的中心位于原点,半径为radius。 参数说明:

Radius 球体半径, slices环绕z轴的剖面数,即球体的经线数目,stacks沿着z轴的剖面数,即球体的纬线数目。 (7)

函数原型:glutWireTetrahedron(void); glutSolidetrahedron(void);

参数说明:没有参数。 (8)

函数原型:

功能:绘制一个圆环体,中心位于原点。 参数说明:

innerRadius 圆环体的内半径,outerRadius slices环绕z轴的剖面数,stacks沿着z(9)茶壶

函数原型:glutWireTeapot(GLdouble size); glutSolidTeapot(GLdouble size); 功能:绘制一个茶壶,中心位于原点。

参数说明:size为茶壶的近似半径,以size2.应用:

修改程序二的display函数中的glRotatef(60,1.0,1.0,1.0);和glutWireCube(0.8);命令,显示不同的对象,从不同的角度观察。

图形学实验指导书

实验二

实验目的:掌握OpenGL基本图元的设计,应用基本图元设计简单物体。 实验内容:

1.OpenGL基本图元的设计 2.应用基本图元设计简单物体

实验原理: (1)

OpenGL中的几何图元用顶点集合定义,形式:

glBegin(type); glVertex....; ....... glEnd();

例:

#include <windows.h> #include <gl/glut.h>

void display(void) {

glClearColor(0.0f,0.0f,1.0f,1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glFlush(); }

void main(int &argc,char **argv) {

glutInit(&argc,argv);

图形学实验指导书

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("hello"); glutDisplayFunc( display); displayMainLoop(); }

(2)设置点的大小

glPointSize(GLfloat size); size指定点的大小,必须大于0,默认是一个像素。 例:glPointSize(5.0); 指定点的大小是个像素。 源程序例子: (3)

实验过程:

本文来源:https://www.bwwdw.com/article/acfj.html

Top