图形学实验指导书1.docx

上传人:b****6 文档编号:7880049 上传时间:2023-05-12 格式:DOCX 页数:14 大小:25.50KB
下载 相关 举报
图形学实验指导书1.docx_第1页
第1页 / 共14页
图形学实验指导书1.docx_第2页
第2页 / 共14页
图形学实验指导书1.docx_第3页
第3页 / 共14页
图形学实验指导书1.docx_第4页
第4页 / 共14页
图形学实验指导书1.docx_第5页
第5页 / 共14页
图形学实验指导书1.docx_第6页
第6页 / 共14页
图形学实验指导书1.docx_第7页
第7页 / 共14页
图形学实验指导书1.docx_第8页
第8页 / 共14页
图形学实验指导书1.docx_第9页
第9页 / 共14页
图形学实验指导书1.docx_第10页
第10页 / 共14页
图形学实验指导书1.docx_第11页
第11页 / 共14页
图形学实验指导书1.docx_第12页
第12页 / 共14页
图形学实验指导书1.docx_第13页
第13页 / 共14页
图形学实验指导书1.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

图形学实验指导书1.docx

《图形学实验指导书1.docx》由会员分享,可在线阅读,更多相关《图形学实验指导书1.docx(14页珍藏版)》请在冰点文库上搜索。

图形学实验指导书1.docx

图形学实验指导书1

OpenGL简介

一、OpenGL概述

OpenGL是图形硬件的一个软件接口(GL代表图形库,GraphicsLibrary)。

使用OpenGL,可以对计算机图形技术进行控制,产生逼真的现实世界的图象或虚拟的现实世界所没有的图象。

OpenGL包括了大约250个不同的函数,程序员可以用这些函数指定物体和操作,创建交互性三维应用程序,而不必为许多应用程序中通用的标准函数编写代码,同时使应用程序避免接触过多的硬件细节。

OpenGL主要关注图象的渲染,即根据几何图形对象的规范及其属性,使用虚拟的照相机和光源来构成一幅图象。

OpenGL是跨平台的一种应用程序接口(ApplicationProgrammer'sInterface,API),因此不包含输入和视窗操作。

对于视窗管理,我们选用OpenGL应用工具包GLUT(OpenGLUtilityToollkit)。

2、OpenGL的组成

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

OpenGL的核心库包含了OpenGL最基本的命令函数。

在这个库中,提供了一百多个函数,这些函数的函数名都以“gl”为前缀。

这些函数用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等几乎所有的二维和三维图形操作。

这一百多个基本函数由于使用各自不同的参数而导致格式的变形,派生出数百个命令。

而且,对于不同的硬件和软件平台,这些函数的使用是完全相同的,这个特性决定了OpenGL的可移植性。

OpenGL的核心库提供了创建基本几何图元的函数,通过基本几何图元的各种组合创建其它几何模型,几何模型也可称为物体。

为了减少编程负担,OpenGL实用函数库提供了40多个创建常用的几何对象函数,立方体、二次曲面等。

OpenGL实用库中函数的函数名以“glu”为前缀,所有函数都是利用核心库中函数编写,使用方法和核心库中函数的使用方法相同。

由于OpenGL是一个图形标准,独立于任何操作系统和窗口系统,OpenGL中没有提供窗口管理和消息事件响应的函数,也没有从鼠标和键盘读取事件的功能。

因此,在不同的操作系统都设计OpenGL了额外的编程辅助库提供一些基本的窗口管理函数、事件处理函数,例如定义窗口的大小、处理键盘和鼠标事件等。

Windows操作系统下的编程辅助库中函数的函数名以“aux”为前缀。

这些编程辅助库是依赖于具体操作系统的,为了支持跨平台,SGI公司的MarkKilgard编写了GLUT,GLUT中函数的函数名以“glut”为前缀。

现在,在Windows操作系统GLUT已经取代了AUX库。

3、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”,表示该命令有一个指向矢量或数组的指针参数,例如:

GLfloatcolor[]={1.0,1.0,1.0};//说明一个浮点型的数组color,GLfloat是数据类型

glColor3fv(color);//数组color作为参数

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

OpenGL命令后缀及对应的数据类型

OpenGL命令中后缀

表示的数据类型

对应的OpenGL类型

对应的C语言类型

b

8位整数

GLbyte

Signedchar

s

16位整数

GLshort

short

i

32位整数

GLint,GLsizei

long

f

32位浮点数

GLfloat,GLclampf

float

d

64位浮点数

GLdouble,GLclampd

double

ub

8位无符号整数

GLubyte,GLboolean

unsignedchar

us

16位无符号整数

GLshort

unsignedshort

ui

32位无符号整数

GLuint,GLenum,GLbitfield

unsignedlong

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

函数原型:

voidglClearColor(GLclampfred,GLclampfgreen,GLclampfblue,

GLclampfalph);

功能:

将缓存的当前清楚颜色设置为给定的颜色值(red,green,blue,alpha);

参数:

(red,green,blue)指定RGB颜色空间的一个颜色值,alpha指定透明度。

命令:

glClear

函数原型:

voidglClear(GLbitfieldmask);

功能:

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

参数:

mask指定需要清除的缓冲区。

缓冲区对应的mask值见表1.1。

如果需要

同时清除多种缓冲区,则将表中的多个值通过逻辑或(|)组合在一起表

示msk值。

例如:

同时清除颜色缓冲区和深度缓冲区。

mask=GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT。

命令:

glColor3f

函数原型:

voidglColor3f(GLfloatred,GLfloatgreen,GLfloatblue);

功能:

将当前的颜色值设置为指定的RGBA模式颜色值(red,green,blue,1.0f),

其中1.0f为默认的混合因子数值。

参数:

(red,green,blue),指定颜色值的R、G、B三个分量每个分量的取值范围

均为区间[0.0,1.0]。

命令:

SwapBuffers

函数原型:

BoolSwapBuffers(HDChdc);

功能:

交换缓冲区,将绘制完成的缓存图像显示在屏幕上。

要求采用双缓存机制。

参数:

hdc指定设备上下文。

返回值:

如果函数执行成功,返回TRUE,否则,返回FALSE。

命令:

glOrtho

函数原型:

voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,

GLdoubletop,GLdoublezNear,GLdoublezFar);

功能:

产生正平行投影变换矩阵。

参数:

left、right分别为裁剪矩形体的左、右侧两个裁剪平面的X轴坐标值。

bottom、top分别为裁剪矩形体的底、顶端两个裁剪平面的Y轴坐标值。

(-zNear)、(-zFar)分别为裁剪矩形体的近、远端两个裁剪平面的

Z轴坐标值。

命令:

glFrustum

函数原型:

voidglFrustum(GLdoubleleft,GLdoubleright,GLdoublebottom,

GLdoubletop,GLdoublezNear,GLdoublezFar);

功能:

产生透视投影变换矩阵。

参数:

left、right分别为裁剪四棱台上底面矩形的左、右侧两条边的X轴坐标值。

bottom、top分别为裁剪四棱台上底面矩形底、顶端两条边的Y轴坐标值。

(-zNear)、(-zFar)分别为裁剪矩形体的近、远端两个裁剪平面的

Z轴坐标值。

命令:

gluPerspective

函数原型:

voidgluPerspective(GLdoublefovy,GLdoubleaspect,

GLdoublezNear,GLdoublezFar);

功能:

产生对称透视投影变换矩阵。

参数:

fovy裁剪四棱台在Y方向上的两个侧面夹角的度数,0

aspect裁剪四棱台上底面

命令:

glViewport

函数原型:

voidglViewport(GLintx0,GLinty0,GLsizeiwidth,GLsizeiheight);

功能:

产生视口变换,将在三维空间中可以显示在屏幕上的点映射到视口中。

参数:

x0,y0视口左下角点在视图窗口坐标下的坐标值;

width视口的宽度;

height视口的高度。

命令:

glVertex3d

函数原型:

voidglVertex3d(GLdoublex,GLdoubley,GLdoublez);

功能:

用在一对函数glBegin和glEnd之间,用来指定一个顶点的坐标值。

参数:

x,y,z顶点坐标的三个分量。

命令:

glBegin和glEnd

函数原型:

voidglBegin(GLenummode);

voidglEnd(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编程;

实验过程:

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

1.源程序

#include

#include

voiddisplay(void){

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

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

voidmain(int&argc,char**argv){

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutCreateWindow("hello");

glutDisplayFunc(display);

displayMainLoop();

}

2.程序内容理解

(1)两个包含文件

#include包含了windows环境下编程所需要的信息。

#include包含了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/LibraryModules”一栏中加入:

opengl32.Lib、glu32.Lib、glut32.Lib,两个文件名以及与原有内容之间用空格间隔。

(4)运行程序

*输入代码;

*编译和连接:

在应用程序窗口,选择“Build”→“Compile”或“Build”。

*运行:

在应用程序窗口,选择“Build”→“Execute”或工具栏按钮“!

”执行程序。

(5)编译、修改

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

4.程序运行结果:

该程序仅创建一个系统默认的应用程序窗口。

5.保存

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

6修改display函数中的glClearColor命令中参数,观察应用程序窗口的颜色变化。

7.清除程序(内存)

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

 

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

1.源程序

#include

#include

voidinit(){

glClearColor(0.0,0.0,1.0,1.0);

}

voiddisplay(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();

}

voidmain(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)修改应用程序窗口的大小和在屏幕显示位置。

3.glutWireCube(GLdoublesize);绘制GLUT中的三维物体

1.GLUT中的三维物体:

命令中“Solid”表示实心物体,“Wire”图形。

下面仅给出函数原型,命令的使用利用C语言知识调用。

(1)立方体

函数原型:

glutWireCube(GLdoublesize);

glutSolidCube(GLdoublesize);

功能:

绘制一个边长为siaze的立方体,立方体中心位于原点。

参数说明:

size为立方体的边长。

(2)圆锥体

数原型:

glutWireCone(GLdoublebase,GLdoubleheight,GLintslices,GLintstacks);

glutSolidCone(GLdoublebase,GLdoubleheight,GLintslices,GLintstacks);

功能:

绘制一个圆锥体,圆锥底面中心位于坐标原点(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(GLdoubleradius,GLintslices,GLintstacks);

glutSolidSphere(GLdoubleradius,GLintslices,GLintstacks);

功能:

绘制一个球体,球体的中心位于原点,半径为radius。

参数说明:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2