图形学实验指导书2009(1)
更新时间:2023-05-27 03:34: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)
实验过程:
正在阅读:
图形学实验指导书2009(1)05-27
DIY化妆品行业环境分析报告05-25
面向对象编程练习题库 - test03-11
香港理工大学的多光谱掌纹数据库_图像处理_科研数据集07-22
网络信息安全综合实验任务书2-科院05-28
教师下乡支教申请书4篇02-24
1新闻发布须懂公众心理05-13
36比尾巴 谢昕颖08-27
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 指导书
- 图形
- 实验
- 2009