|
《3D游戏软件设计》课程第一版
期末复习资料
《3D游戏软件设计》课程第一版(PPT)讲稿章节目录:
第1章 OpenGL简介
1.1 OpenGL简介
1.2 OpenGL的功能及工作流程
1.3 OpenGL函数库
1.4 OpenGL开发环境
1.5 创建一个简单的OpenGL工程
第2章 基本图元绘制
2.1 点、线段的绘制
2.2 虚线、多边形的绘制
第3章 颜色
3.1 计算机颜色的概念
3.2 OpenGL的颜色模式
3.3 两种颜色模式的应用
3.4 颜色应用举例
3.5 明暗处理
第4章 变换
4.1 用相机模拟的思路来理解变换
4.2 OpenGL坐标系
4.3 三维图形显示流程
4.4 OpenGL几何变换
4.5 OpenGL视图变换
4.6 OpenGL投影变换
4.7 OpenGL裁剪变换
4.8 OpenGL视口变换
4.9 OpenGL矩阵堆栈
4.10 OpenGL变换实例
第5章 动画
5.1 计算机动画
5.2 双缓冲技术
5.3 GLUT窗口动画的实现
第6章 绘制三维图形
6.1 绘制立方体
6.2 在3D空间用OpenGL自带的库函数绘制
第7章 三维场景漫游
7.1 绘制一个简单的三维场景
7.2 第一人称视角行走的实现方法
7.3 键盘控制
7.4 鼠标控制
第8章 光照
8.1 基本概念
8.2 光源
8.3 材质
8.4 光照模型
第9章 纹理
9.1 纹理基本概念
9.2 OpenGL纹理实现过程(PPT02 ~ PPT04)
9.3 OpenGL纹理实例
第10章 显示列表
10.1 显示列表概念
10.2 使用显示列表的步骤
10.3 显示列表的应用
10.4 显示列表实例
第11章 混合
11.1 混合的概念
11.2 混合的过程
11.3 设置混合因子的函数
11.4 混合方程式函数
11.5 混合的应用
11.6 三维混合
第12章 建立非控制台的windows程序框架
12.1 windows应用程序基本框架
12.2 基于windows应用程序框架的OpenGL程序设计
第13章 纹理混合综合实例
一、 客观部分:(单项选择、多项选择、不定项选择、判断)
此类题目制作说明:请在此处增加考核知识点中涉及公式明示。请设置部分例题进行练习掌握,此例题可以为任课教师提供的题库题目,采纳题库题目需低于题库本项题目的30%。题目内容计算过程及资料请删除,不提供给学生。样例如下:
★考核知识点: OpenGL状态机
参见讲稿章节:1
OpenGL是一个状态机。可以通过glEnable来启用状态,glDisable来禁用状态。
例题:
单选题:
1、 若要启用光源,需要调用以下哪个函数?( )
A.glEnable(GL_LIGHTING) B. glEnable(GL_TEXTURE_2D)
C. glEnable(GL_BLEND) D. glEnable(GL_CLIP_PLANE)
★考核知识点: OpenGL库函数的特点
参见讲稿章节:1
OpenGL库函数用后缀表示入口参数类型。i表示参数类型为整数型,f表示为float类型,v表示参数可用数组来替代一系列单个参数值。参数类型后缀前带有数字2、3、4,2代表二维,3代表三维,4代表alpha值。
如图所示:
例题:
单选题:
1、 OpenGL库函数中后缀字幕v表示函数参数可用类型为()。
A. 整型数据
B. 浮点型数据
C. 数组型数据
D. 三维坐标
★考核知识点: 基本图元的绘制
参见讲稿章节:2
绘制点:glVertex*()
点大小设置函数:glPointSize(float size),注意,该函数需要放在绘制点函数之前。
绘制线段:线段连接方式GL_LINES GL_LINE_STRIP GL_LINE_LOOP
线宽度设置函数:glLineWidth(float width)
例题:
单选题:
1、要得到如右图示的效果,glBegin() 函数的类型参数可取为( )。
A. GL_POLYGON
B. GL_LINES
C. GL_LINE_STRIP
D. GL_LINE_LOOP
★考核知识点: 颜色模式
参见讲稿章节:3
在OpenGL中颜色有两种模式:RGB模式和颜色索引模式。
明暗处理方式将会影响最终的颜色显示,明暗处理方式有两种:GL_FLAT平面模式和GL_SMOOTH光滑过渡模式。
例题:
单选题:
1、 在程序中绘制了一个带颜色的三角形,其中三个顶点分别绘制三种不同的颜色,若要实现三个顶点分别为三种颜色的彩色三角形,应调用下面哪个函数?()
A. glColor3f()
B. glShadeModel(GL_FLAT);
C. glShadeMode(GL_SMOOTH);
D. glHint()
★考核知识点: 多边形的绘制
参见讲稿章节:2
OpenGL中规定的多边形必须是凸多边形。
绘制多边形时,图元顶点的连接方式有:
程序格式为:
约定“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即为“反面”。
多边形的绘制模式有:(1)填充式(默认) – GL_FILL(2)轮廓线式 – GL_LINE(3)顶点式 – GL_POINT(4)镂空图案填充式,使用函数glPolygonMode(GL_FRONT, GL_FILL); 来设置。
例题:
判断题:
1. OpenGL约定顶点以逆时针顺序出现在屏幕上的多边形为反面。( )
★考核知识点: 复合变换的顺序
参见讲稿章节:4
在复合变换中,函数的调用顺序与实际变换顺序是相反的。“先移动后旋转”和“先旋转后移动”得到的结果不一样。
例题:
判断题:
1、OpenGL几何变换函数调用顺序和预想的操作顺序是一致的。( )
★考核知识点: 动画
参见讲稿章节:5
出于效率考虑,OpenGL将绘制命令做了缓冲处理,单缓冲可通过调用glFlush()函数,双缓冲可通过glutSwapBuffer()函数,强制绘制器将结果立即输出。在OpenGL中要实现动画效果,需要采用双缓冲技术。在GLUT窗口模式中,可以通过函数glutInitDisplayMode(GLUT_DOUBLE)设置当前窗口模式为双缓冲模式。
例题:
选择题:
1、在OpenGL中要实现动画效果,需要采用( )技术
A. 单缓冲
B. 关键帧
C. 双缓冲
D. 深度缓冲
★考核知识点: 纹理定义
参见讲稿章节:9
纹理有一维纹理、二维纹理、三维纹理。
例题:
判断题:
1. 在OpenGL中,纹理可以是一维、二维或三维。(√)
★考核知识点: 纹理实现过程
参见讲稿章节:9
纹理实现过程较为复杂,注意各个步骤的函数。
(1) 启用纹理
glEnable(GL_TEXTURE_2D);
(2) 定义纹理
定义纹理的函数较为复杂,具体看PPT中举例。
glTexImage2D()
(3) 创建纹理对象
glGenTextures(1,&texture_ID)
(4) 纹理滤镜
纹理滤镜主要包含了放大、缩小、重复三种方式。
注意GL_REPEAT和GL_CLAMP两种不同的重复方式。
(5) 选择纹理
glBindTexture(GL_TEXTURE_2D,texture[0]);
(6) 坐标映射
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
例题:
多选题:
1、纹理滤镜函数glTexParameter可以实现对纹理的操作包括( )
A. 放大纹理
B. 缩小纹理
C. 重复纹理
D. 定义纹理
★考核知识点: 显示列表
参见讲稿章节:10
在编写OpenGL程序时,遇到重复的工作,可以创建一个显示列表,把重复的工作装入其中,并在需要的地方调用这个显示列表。
显示列表的使用步骤:
(1) 分配显示列表编号 glGenLists()
(2) 创建显示列表 glNewList()
(3) 调用显示列表 glCallList()
显示列表只能装入OpenGL函数,不能装入其它内容,并非所有的OpenGL函数都可以装入显示列表中。
例题:
单选题:
1、在编写OpenGL程序时,遇到重复的工作,可以通过创建( )的方法来优化程序。
A. 函数
B. 显示列表
C. 顶点数组
D. 双缓冲
判断题:
1、用于查询的函数可以被装入到显示列表中。()
★考核知识点: 深度&深度缓冲
参见讲稿章节:11
深度,就是在OpenGL坐标系中,像素点的z坐标距离摄像机的距离。摄像机可能放在坐标系的任何位置,那么就不能简单的说z数值越大或越小,就是越靠近摄像机。
深度缓冲区,是这样一段数据,它记录了每一个像素距离观察者有多近。在启用深度缓冲测试的情况下,如果将要绘制的像素比原来的像素更近,则像素将被绘制,否则,像素会被忽略掉,不进行绘制。
例题:
单选题:
1、在OpenGL坐标系中,像素点的Z坐标距离摄像机的距离被称之为( )。
A. 深度缓冲
B. 深度测试
C. 深度
D. 深度截取
2、启动深度缓存区的函数为?( )
A. glEnable(GL_DEPTH_CLAMP);
B. glEnable(GL_DEPTH_TEST);
C. glEnable(GL_CULL_FACE);
D. glClear(GL_DEPTH_BUFFER_BIT);
3、清除深度缓存区的函数为?( )
A. glEnable(GL_DEPTH_CLAMP);
B. glEnable(GL_DEPTH_TEST);
C. glEnable(GL_CULL_FACE);
D. glClear(GL_DEPTH_BUFFER_BIT);
★考核知识点: 绘制三维实体
参见讲稿章节:10
可以使用glut库和aux库函数绘制三维实体。如:
glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 线框球
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球
glutWireCube(GLdouble size); 线框立方体
glutSolidCube(GLdouble size); 实心立方体
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); 线框圆环
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); 实心圆环
glutWireIcosahedron(void); 线框20面体
glutSolidIcosahedron(void); 实心20面体
glutWireOctahedron(void); 线框8面体
glutSolidOctahedron(void); 实心8面体
例题:
单选题:
1. 以下哪个函数可以绘制出一个实心球体?( )
A. glutWireSphere()
B. glutSolidSphere()
C. glutSolidCube()
D. glutWireCone()
二、主观部分:
此类题目制作说明:请在此处增加考核知识点中涉及公式明示。请设置部分例题进行练习掌握,此例题可以为任课教师提供的题库题目,采纳题库题目需低于题库本项题目的30%。题目内容计算过程及资料请删除,不提供给学生。
★考核知识点: OpenGL的正确认知
参见讲稿章节:1.1
能准确定位OpenGL。
OpenGL是一个开放的图形库;OpenGL是一套底层三维图形API;OpenGL是与硬件无关的软件接口。
例题:
填空
1、 OpenGL是一个 与图形的 接口,实际上就是一个三维图形和模型库,可以在任意平台和操作系统上运行。
★考核知识点: OpenGL函数库
参见讲稿章节:1.3
了解OpenGL函数库及其区别。掌握库函数的特点,如前缀、后缀。
OpenGL核心库是GL;实用库是GLU;工具库是GLUT(该库函数主要提供基于窗口的工具,并且不依赖于运行环境,因此OpenGL的工具库可以在所有OpenGL平台上运行);辅助库AUX.
例题:
1、 OpenGL的辅助库函数前缀是 。
2、 OpenGL中的 和 可以在所有的OpenGL平台上运行。
★考核知识点: GLUT窗口函数
参见讲稿章节:1.5
掌握Win32 Console Application工程框架中GLUT窗口函数的使用。
如程序:
#include<GL/glut.h>
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f,-0.5f,0.5f,0.5f);
glFlush();
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("第一个opengl程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
该程序为最简单的基于win32控制台窗口应用程序。其中:
 #include<GL/glut.h>是将能创建窗口的GLUT库包含进来。
 glutInit(&argc,argv)GLUT初始化
 glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)GLUT库在创建窗口的时候使用哪种类型的显示模式,这是的标志GLUT_SINGLE告诉它使用单缓冲区窗口,并且是RGB颜色模式。
 glutInitWindowPosition(100,100);初始化窗口在屏幕中的位置
 glutInitWindowSize(400,400);初始化窗口的大小
 glutCreateWindow("第一个opengl程序");在屏幕上创建窗口,窗口的名字将显示“第一个opengl程序”
 glutDisplayFunc(&myDisplay);显示回调函数,将要在窗口中绘制的内容需在函数myDisplay中,GLUT会自行调用。
 glutMainLoop();消息循环
例题:
谋学网(www.mouxue.com):
1、 glutInitDisplayMode()函数的作用是__________。
★考核知识点: OpenGL颜色
参见讲稿章节:3
OpenGL颜色模式包括了:
RGB模式,即所有颜色定义全用R\G\B\Alpha三个值;可以用glColor*()来定义当前颜色。
颜色表模式,每一个像素的颜色是用颜色表中的某个颜色索引值表示。
在OpenGL中多边形的填充处理方式为明暗处理,包括两种:平面明暗处理GL_FLAT,即用单一颜色填充;平滑明暗处理GL_SMOOTH,该模式下填充颜色过渡自然连续。
例题:
谋学网(www.mouxue.com):
1、 计算机颜色通常用___、____、__ ___三个值来表示。
2、几何图元的明暗处理方式是 和 。
★考核知识点: OpenGL三维渲染管线
参见讲稿章节:4
OpenGL采用右手坐标系。
OpenGL渲染管线是指三维图形渲染的过程中显卡执行、从几何体到最终渲染图像、数据传输处理计算的过程。
渲染管线示意图见下图。
(中文渲染管线示意图见下)
其中顶点变换中每个坐标系简介如下:
模型坐标系(MC):也称为物体坐标系,是特定物体相关联的坐标系。当物体位移或改变方向时,和该物体相关的坐标系也随之移动和改变方向。
(模型顶点的坐标都是在模型坐标系中描述的。)
(如“向前走一步”,则是向你的物体坐标系发指令;“前后左右”这样的概念只有物体坐标系才有意义;“向左转”是物体坐标系;“向东”是世界坐标系的概念。)
世界坐标系(WC):这是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架,另一方面说,能用世界坐标系描述其他坐标系的位置,而不能用更大的坐标系来描述世界坐标系。
视图坐标系(VC):这是一种特殊的物体坐标系,该物体坐标系定义摄像机的屏幕可视区域。关于摄像机坐标系的轴向约定可能不同。
(Opengl采用右手坐标系,即摄像机在原点,X轴向右,Z轴向前/外,Y轴向上。2D屏幕上显示的内容就是3D摄像机坐标系通过投影转换呈现的。)
投影坐标系(PC):将世界坐标系中的物体映射到视图坐标系(屏幕坐标系)上的方法称为投影。投影的方式包括平行投影和透视投影两种。
设备坐标系(DC):即最终呈现在显示设备上的窗口坐标。Windows窗口坐标为左下角为原点,X轴向右为正,Y轴向上为正。
例题:
问答题:
1、 描述一下OpenGL的渲染管线。
★考核知识点: 变换及变换函数
参见讲稿章节:4
在三维图形渲染管线中,能从模型坐标系变换到世界坐标系的变换是“模型变换(几何变换)”;将世界坐标系中的物体映射到视图坐标系的变换为“投影变换”。将投影平面上的画面映射到窗口上的变换为“视口变换”。将观察坐标系变换到世界坐标系,即调整观察视点的变换为“视图变换”,视图变换与模型变换是互逆变换。
投影变换包括正交投影和透视投影。
几何变换是操作几何对象,包括平移、旋转、缩放。
• 平移变换函数glTranslate*()
• 旋转变换函数glRotate*()
• 放缩变换函数glScale*()
• 视图变换函数gluLookAt(GLdouble eyex,Gldouble eyey,GLdouble eyez,
GLdouble centerx,GLdouble centery, GLdouble centerz,
GLdouble upx, GLdouble upy, Gldouble upz)
其中参数:
eyex/eyey/eyez:前三个参数表示了观察点的位置;
centerx/centery/centerz:中间三个参数表示了观察目标的位置;
upx/upy/upz:最后三个参数代表从(0,0,0)到(x,y,z)的直线,它表示了观察者认为的“上”方向。
• 投影变换函数
要求掌握各函数及参数的正确使用。
(1) 正交投影函数glOrtho(GLdouble left,Gldouble right,Gldouble bottom,GLdouble top,GLdouble near,GLdouble far)
(2) 透视投影函数glFrustum (GLdouble left,Gldouble right, GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
(3) 透视投影函数glPerspective(GLdouble fovy, GLdouble aspect,GLdouble zNear, GLdouble zFar)
• 视口变换函数
glViewport(GLint x,GLint y, GLsizei width, GLsizei height);
例题:
谋学网(www.mouxue.com):
1、 glMatrixMode(GL_MODELVIEW);函数的作用是 。
2、 如果有glFrustum(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0),则近裁剪面的左下角坐标为 ,右上角坐标为 ;
3、 如果有glFrustum(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0),则远裁剪面的左下角的坐标为 ,右上角的坐标为 。
4、 如果有glOrtho(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0),则近裁剪面的左下角坐标为 ,右上角坐标为 ;远裁剪面的左下角的坐标为 ,右上角的坐标为 。
5、 写出实现沿X轴正方向平移5个单位的函数语句
6、 已知glViewport(0,0,width,height);定义了视口大小,设近裁剪面为0.1,远裁剪面为1000,观察视角为45度,该如何设置透视投影函数参数:
7、 gluLookAt函数的参数意义是
★考核知识点: 矩阵堆栈
参见讲稿章节:4
矩阵堆栈操作顺序与压入矩阵的顺序相反。
glPushMatrix()表示将所有矩阵依次压入堆栈,glPopMatrix()表示弹出堆栈顶部矩阵。
在变换前需要把当前矩阵设置为单位矩阵:glLoadIdentity()
例题:
谋学网(www.mouxue.com):
1、 glPopMatrix()函数的作用是 。
2、矩阵堆栈操作与压入矩阵的顺序 。
★考核知识点: 光源
参见讲稿章节:8
绘制真实感图形可以通过添加光源和添加材质来实现。
OpenGL支持在同一场景中设置有限多个光源,通常可以设置8个不同颜色的光源。
对光照效果的计算是由四个不同的光照分量叠加而成的:
(1) 环境光
环境光实际上模拟了环境中源自所有光源的散光,该光源所照射的物体在所有方向的表面都是均匀照亮的。
(2) 散射光
散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上向不同方向均匀的反射开来。
(3) 镜面光
镜面光模拟光泽物体表面反射的光线。
(4) 发射光
发射光模拟那些源自某个物体的光。
例题:
谋学网(www.mouxue.com):
1、 OpenGL对光照效果的计算是由四个不同的光照分量叠加而成的,即: 、 、 、 。
★考核知识点: 光源RGB值与材质RGB值的关系
参见讲稿章节:8
光源颜色分解为R、G、B三种成分,相当于R、G、B每种颜色的完全强度百分比。材质颜色是对光的R、G、B三原色的反射率来近似定义材料的颜色。
如果一束OpenGL光线的成分是(LR,LG,LB),一种材质的成分(MR,MG,MB),那么进入眼睛的颜色值就是(LR*MR, LG*MG, LB*MB)。
如果两束光进入人眼,它的成分分别是(R1,G1,B1)和(R2,G2,B2),那么叠加在一起的光颜色就是(R1+R2,G1+G2,B1+B2),当值超过1时,它会被自动截取为1.
例题:
问答题:
1、材质RGB值和光源RGB值都用相同的方式表示,他们意义一样吗?
★考核知识点: 添加光照的步骤
参见讲稿章节:8
(1) 为场景物体的顶点提供法线向量,这些法线确定了物体各个顶点相对于光源的方位;函数为glNormal*();
(2) 启用光照计算,然后创建、选择一个或多个光源,并在场景中为光源定位;
创建光源glLight*()
启动光照glEnable(GL_LIGHTING)
激活某个光源glEnable(GL_LIGHT0)
(3) 创建并选择光照模型,它定义了全局环境光的等级和观察点的有效位置等;
glLightfv(GL_LIGHT0,GL_POSITION,light_position),注意light_position最后的参数值,若为0则代表光源无限远,即平行光源,否则代表位置性光源。
glLightModel*()函数来制定光照模型的所有属性。
(4) 为场景中的物体定义材质属性。
定义材质:glMaterial*()
例题:
问答题:
1、 描述一下向OpenGL场景中添加光照的四个步骤。
程序设计题:
1、写出设置材质的漫反射光成分的函数。
★考核知识点: 目标&源
参见讲稿章节:11
目标颜色:已经存在于颜色缓冲区中的颜色值,即已绘制的颜色。
源颜色:来自于渲染命令的颜色,即新绘制的颜色。
例题:
判断题:
1、目标颜色就是来将要绘制的颜色。()
★考核知识点: 设置混合因子
参见讲稿章节:11
glBlendFunc(源因子,目标因子);
掌握常见的混合因子设置方法,示例参看PPT。
如果想要将一幅图像的黑色背景完全镂空,混合因子应当设置为glBlendFunc(GL_DST_COLOR, GL_ZERO);
例题:
谋学网(www.mouxue.com):
1、 假设先绘制的三角形颜色为(0.0,1.0,0.0,0.5),后绘制的三角形颜色为(1.0,0.0,0.0,0.75),如果要将这两个图形形成叠加效果,那么该如何设置混合因子函数:______________
★考核知识点: 三维混合
参见讲稿章节:11
在一个三维场景中,如何绘制半透明物体是一个难点。基本的思想是先绘制所有不透明的问题,然后将深度缓冲区设为“只读”状态,根据混合的原理(注意目标颜色与源颜色的顺序)绘制所有半透明物体,最后将深度缓冲区还原为“可读写”状态。
例题:
问答题:
1、 描述在三维混合场景中,绘制透明和半透明物体的顺序?
|
|