资源描述
一、 选择题(每题1分,共10分)
1、通过( A )技术,我们可以将2D图像数据映射到3D图元上,以增强场景的真实感。
A. 纹理映射 B.模板 C. 光照 D. 混合
2、要得到如右图示的效果,glBegin() 函数的类型参数可取为( C )。
A. GL_POLYGON
B. GL_LINES
C. GL_LINE_STRIP
D. GL_LINE_LOOP
3、要实现屏幕区域的多视口显示,应采用( C )函数。
A. glOrtho() B. gluPerspective() C. glViewport() D. gluLookAt()
4、从下面四个侯选项中选择两个OpenGL语句,可以使摄像机从源位置变换到目标位置。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
_______B_________;
_______D_________;
A. glTranslatef(0.0,0.0,-d)
B. glTranslatef(0.0,0.0,d)
C. glRotatef(-90.0,0.0,1.0,0.0)
D. glRotatef(90.0,0.0,1.0,0.0)
5、由 K 个控制顶点 Pi(i=1,… k) 所决定的 n 次 B 样条曲线,由 ( C ) 段n次B样条曲线段光滑连接而成。
1 -1 0
0 1 0
0 0 1
A. k-n-2 B. k-n-1 C. k-n D. k-n+1
6、使用二维图形变换矩阵: T= 如果图形的一个顶点坐标为A(6,8),则
变换后A’的坐标为( C )。
A.(2,-8) B. (-2,-8) C. (2,8) D. (-2,8)
7、点P的坐标为(8,6,4,2),对应的空间齐次坐标为 ( D )。
A. (8,6,4,2) B. (8,6,4) C. (4,3,2) D. (4,3,2,1)
8、当观察光照下的光滑物体表面时,在某个方向上看到高光或强光,这个现象为 ( B )
A. 漫反射 B.镜面反射 C. 环境光 D. 折射
9、双三次Bezier 曲面的4条边界都是三次Bezier 曲线, 其特征网络有 ( C ) 个顶点。
A. 9 B. 12 C. 16 D. 20
10、三维空间中的几何图元上有一点P(1,2,3), 参考海平面方程为y+1=0,等高面方程为x+1=0,则P点的纹理坐标P’(s,t)为 ( A )。
A. P’(2,3) B. P’(3,2) C. P’(-1,-1) D. P’(1,1)
11、OpenGL默认情况下显示模式为( A )。
A. 单缓存模式 B. 双缓存模式 C. RGB颜色模式 D. 深度测试模式
12、OpenGL包含200多个函数,其中gluLookAt()属于( C )种函数。
A. 图元函数 B. 属性函数 C. 观察函数 D. 控制函数
13、位图位置由光栅位置决定,指定光栅位置的函数是( B )。
A. glTranslatef() B. glRasterPos() C. glRotatef() D. glRasterPosition()
14、由 K 个控制顶点 Pi(i=1,… k) 所决定的 n 次 B 样条曲线,由 ( C ) 段n次B样条曲线段光滑连接而成。
0 -1 0
1 0
0 1
A. k-n-2 B. k-n-1 C. k-n D. k-n+1
15、使用二维图形变换矩阵: T= 如果图形的一个顶点坐标为A(6,8),则
变换后A’的坐标为( C )。
A.(8,-6) B. (-6,8) C. (-8,6) D. (6,-8)
16、点P的坐标为(8,6,2),对应的空间齐次坐标为 ( A )。
A. (8,6,2,1) B. (8,6,2,0) C. (4,3,1,1) D. (4,3,1,0)
17、材质属性应与光照属性相匹配,如果需要指定一个面片在红光源照射下呈现黄色,应将面片材质的漫反射和环境反射属性指定为 ( B )
A. 红色 B. 绿色 C. 兰色 D. 白色
18、三次Bezier 曲线由 ( D ) 个控制点确定。
A. 1 B. 2 C. 3 D. 4
19、下面哪些不是OpenGL标准几何元素的绘制模式? ( A )
A. GL_FOG(雾化处理,不是绘图模式) B. GL_LINE_STRIP(不闭合折线)
C. GL_POINTS(单个顶点集) D. GL_TRIANGLE_FAN(扇形连续填充三角形串)
二、 填空题(每空1分,共20分)
1、 OpenGL有两条平行的流水线,一条是______几何流水线_______,另一条是______像素流水线______。
2、 OpenGL函数库主要分为三类:___核心库___、___工具库___、___辅助库___。
3、 如果有glOrtho(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0),则近栽剪面的左下角坐标为 _(-1.5, -1.5, 10.0)__,右上角坐标为__(1.5,1.5,10.0)__;远裁剪面的左下角的坐标为___(-1.5,-1.5,-10.0)__,右上角的坐标为__(1.5,1.5,-10.0)___。
4、 绘制真实感图形主要进行两种操作:_____设置光源_____和_____设置材质_____。
5、 在OpenGL中,每个光源包括以下属性_____颜色_____、_____位置_____、_____方向_____。
6、 OpenGL对光照效果的计算是由四个不同的光照分量叠加而成的,即:_环境光_、_漫反射光_、__镜面反射光__、____发射光____。
7、 在设置了光源属性以后,必须打开光源才能使光源有效,启用光源,即调用函数_______glEnable(GL_GLIGHTING)_______。
8、 写出实现沿x轴正方向平移5个单位的函数语句__glTranslatef(5.0, 0.0, 0.0)__。
9、 OpenGL有两个重要优点。首先,OpenGL非常接近底层__硬件____,使得用OpenGL编写的程序具有较高的运行效率;其次,OpenGL易于___掌握___和___使用___。
10、 出于效率考虑,OpenGL将绘制命令做了缓冲处理。单缓冲可通过调用___glFlush()___函数,双缓冲可通过_____glutSwapBuffer()_____函数,强制绘制器将结果立即输出。
11、 如果有glFrustum(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0),则近栽剪面的左下角坐标为 _(-1.5, -1.5, 10.0)__,右上角坐标为__(1.5,1.5,10.0)__;远裁剪面的左下角的坐标为___(-1.5,-1.5,-10.0)__,右上角的坐标为__(1.5,1.5,-10.0)___。
12、 OpenGL中所需的坐标系变换由两个矩阵决定,即__模型视图矩阵__和_ 投映矩阵__。
13、 GLU提供了三种类型的二次曲面,即____球体____、____圆柱体____和____圆盘____。
14、 仿射变换是操纵几何对象,为场景制作动画效果及获取理想视图的关键,主要有__平移__、__旋转__和__缩放__。
15、 OpenGL通过一个综合了__漫反射__、__镜面反射__、__环境光__以及__发射光__等多种因素的光照模型来模拟现实世界中我们所看到的颜色。
16、 绘制曲线时,通过预先设置的四个控制点,可绘制__贝塞尔曲线__或__插值曲线__或_B样条曲线_。
三、 判断题(对的打 √,错的打 ×,每题1分,共10分)
1、 OpenGL只能画二维图形,不能画三维图形。 ( × )
2、 齐次坐标 (1, 2, 3, 0) 表示三维空间的矢量 (1, 2, 3) ( √ )
3、 消隐算法中,场景里的多边形在Z-Buffer算法中是要求排序的,而在画家方法中就不用排序了。 ( × )
4、 所有图形都可以看成是由直线段组成的。 ( × )
5、 图形变换有两种形式:视景体坐标变换和模型视图变换。 ( √ )
6、 自由曲线可以用一条标准代数多项式方程来描述。 ( √ )
7、 B曲线具有对称性质。 ( √ )
8、 齐次坐标可表示图形中无穷远点。 ( √ )
9、 组合变换就是由若干个基本的几何变换组合而成。 ( × )
10、 投影(project)是一种使三维对象映射为二维对象的变换。 ( √ )
11、 OpenGL中点和直线的大小和宽度都是1个像素。 ( × )
12、 启用光照后,glColor3f()函数将全部失效,面片颜色应由材质函数来完成。 ( √ )
13、 几何图元纹理映射时不会发生绮变。 ( × )
14、 一个复杂的几何图元可以分解成许多简单的图元并保存在显示列表中。 ( √ )
15、 几何图元除仿射变换外,就没有其他变换了。 ( × )
16、 离散图元的光栅化位置不受模型视图矩阵和投影矩阵的影响。 ( × )
17、 通过修改glLookAt()函数参数,可以改变虚拟摄像机的位置和朝向。 ( √ )
18、 光照和材质不是OpenGL状态的一部分,法向量更不是。 ( × )
19、 OpenGL只能绘制曲线不能绘制曲面。 ( × )
20、 绘制曲线时,插值曲线不保证连续,贝塞尔曲线不保证光滑,B样条曲线可保证连续且光滑。 ( √ )
四、 程序设计题(共60分)
1、 右图示的某程序菜单用鼠标右键控制。要求编写用glut库函数实现该菜单功能的OpenGL程序。
#include <gl\glut.h>
#include <stdio.h>
GLint MainMenu,SubMenu1,SubMenu2;
void SubMenu1_Fun(GLint val){
switch(val){
case 1:
printf("这是子菜单Spot的Expoint+项!\n\r");
break;
case 2:
printf("这是子菜单Spot的EXPOINT-\n\r");
break;
case 3:
printf("这是子菜单Spot的CUTOFF+!\n\r");
break;
case 4:
printf("这是子菜单Spot的CUTOFF-!\n\r");
break;
default:
printf("这是子菜单Spot的其他项!\n\r");
}
}
void SubMenu2_Fun(GLint val){
switch(val){
case 1:
printf("这是子菜单Colors的Red!\n\r");
break;
case 2:
printf("这是子菜单Colors的Green!\n\r");
break;
case 3:
printf("这是子菜单Colors的Blue!\n\r");
break;
default:
printf("这是子菜单Colors的其他项!\n\r");
}
}
void Menu_Func(GLint val){
switch(val){
case 1:
printf("这是主菜单的Spot\n\r");
break;
case 2:
printf("这是主菜单的Colors\n\r");
break;
default:
printf("这是主菜单其他项\n\r");
}
}
void myDisp(void){
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
int main(int argc,char ** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(200,100);
glutInitWindowSize(400,300);
glutCreateWindow("多级菜单示例!");
SubMenu1=glutCreateMenu(SubMenu1_Fun);
glutAddMenuEntry("Expoint+",1);
glutAddMenuEntry("Expoint-",2);
glutAddMenuEntry("Cutoff+",3);
glutAddMenuEntry(“Cutoff-“,4);
SubMenu2=glutCreateMenu(SubMenu2_Fun);
glutAddMenuEntry("Red",1);
glutAddMenuEntry("Green",2);
glutAddMenuEntry("Blue",3);
MainMenu=glutCreateMenu(Menu_Func);
glutAddSubMenu("Spot",SubMenu1);
glutAddSubMenu("Colors",SubMenu2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(myDisp);
glutMainLoop();
}
2、 读下面程序,在右边空白处用文字和图示将程序函数模块主要功能及运行结果描述出来。
#include <gl/glut.h>
GLfloat planes[]={-1.0,0.0,1.0,0.0};
GLfloat planet[]={0.0,-1.0,0.0,1.0};
static GLfloat theata[]={0.0,0.0,0.0};
static GLint axis=2;
GLubyte image[64][64][3];
Init函数主要功能有:
1、 初始化图片位图
2、 启用深度测试和融合
3、 设置解压缩像素贮存格式
4、 启用纹理,设置相关参数
void init(void){
GLint i,j,c;
for(i=0;i<64;i++){
for(j=0;j<64;j++){
c=(((i&0x8)==0)^((j&0x8)==0))*255;
image[i][j][0]=(GLubyte)c;
image[i][j][1]=(GLubyte)c;
image[i][j][2]=(GLubyte)c;
}
}
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D,0,3,64,64,0,GL_RGB,GL_UNSIGNED_BYTE,image);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
}
Key函数主要功能有:
1、 响应键盘事件,按键‘1’,开始旋转图形
2、 按键‘2’,停止旋转图形
void key(unsigned char k,int x,int y){
if(k=='1') glutIdleFunc(spinCube);
if(k=='2') glutIdleFunc(NULL);
}
spinCube函数主要功能有:
1、 改变当前旋转轴旋转角,限制旋转角在0~360度范围内
2、 重新刷新当前窗口
void spinCube(void){
theata[axis]+=2.0;
if(theata[axis]>360.0)theata[axis]-=360.0;
glutPostRedisplay();
}
Mouse函数主要功能有:
1、 响就鼠标事件
2、 通过左中右键改变旋转轴
void mouse(int btn,int state,int x,int y){
if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
axis=0;
if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN)
axis=1;
if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)
axis=2;
}
MyReshape函数主要功能有:
1、 响应窗口变化事件
2、 设置视口位置和大小
3、 设置正交视景体,确保绘制图形保持刚性变换
4、 设置模型视图矩阵
5、 自动调用display函数
void myReshape(int w,int h){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(
-2.0, 2.0,
-2.0*(GLfloat)h/(GLfloat)w,2.0*(GLfloat)h/(GLfloat)w,-10.0, 10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h,2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Display函数主要功能有:
1、 清除颜色缓冲区和深度缓冲区内容
2、 初始化当前矩阵变换
3、 设置X、Y、Z轴旋转变换矩阵
4、 绘制茶壶
5、 交换前后台缓存内容,执行所有OpenGL命令,并将最后结果在当前窗口中显示出来
glLoadIdentity();
glRotatef(theata[0],1.0,0.0,0.0);
glRotatef(theata[1],0.0,1.0,0.0);
glRotatef(theata[2],0.0,0.0,1.0);
glutSolidTeapot(1.0);
glutSwapBuffers();
}
void main(int argc,char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("旋转的纹理茶壶...");
Main函数主要功能有:
1、 初始化OpenGL环境
2、 初始化显示模式为双缓存、RGBA颜色和深度测试
3、 初始化创建窗口
4、 注册窗口回调函数、显示回调函数、系统空闲回调函数、鼠标回调函数和键盘回调函数
5、 调用初始化函数init
6、 调用窗口消息循环函数,监控窗口事件
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(spinCube);
glutMouseFunc(mouse);
glutKeyboardFunc(key);
glClearColor(1.0,1.0,1.0,1.0);
init();
glutMainLoop();
}
3、 如右图所示,假定将正方形的4个顶点定义为一个单位圆周上的4个等间隔点,试编写OpenGL程序,使得正文形能按θ角旋转(注意旋转角θ可自定义大小)。
#include <gl\glut.h>
#include <math.h>
#define RAD 0.017453
GLfloat theata=0.0;
Void myDisp(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(cos(RAD*theata,sin(RAD*theata));
glVertex2f(-sin(RAD*theata),cos(RAD*theata));
glVertex2f(-cos(RAD*theata),-sin(RAD*theata));
glVertex2f(sin(RAD*theata),-cos(RAD*theata));
glEnd();
glFlush();
}
Void myIdle(void){
Theata+=2.0;
If(theata>360) theata-=360;
glPostRedisplay();
}
Int main(int argc,char ** argv){
glutInit(&argc,argv);
glutInitDisplayModel(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0.0);
glutInitWindowSize(400,300);
glutCreateWindow(“这是一个旋转的矩形!”);
glutDisplayFunc(myDisp);
glutIdleFunc(myIdle);
glutMainLoop();
}
4、 读下面程序,在右边方框处用文字将程序函数模块主要功能描述出来。(40分)
#include <Windows.h>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
GLint PWidth,PHeight,MaxVal,PSize;
GLfloat scale;
GLuint * image;
getPic() 函数主要功能:
1、 从PPM文件中获取图片数据,并保存在数组image中;
2、 指定纹理缩放因子scale的大小。
void getPic(void){
GLuint err;
FILE * fd;
GLint i;
char c;
char b[100];
wchar_t d[100];
GLint red,green,blue;
printf("请输入PPM文件名:\n");
scanf_s("%s",b,sizeof(b));
err=fopen_s(&fd,b,"r");
if(err){
swprintf_s(d,sizeof(d),L"错误代码是:%d",err);
MessageBox(NULL,d,L"提示!",MB_OKCANCEL);
exit(0);
}
fscanf_s(fd,"%[^\n] ",b,sizeof(b));
if(b[0]!='P'||b[1]!='3'){
printf("%s is not a PPM file!\n",b);
exit(0);
}
printf("%s is a PPM file\n",b);
fscanf_s(fd,"%c",&c,sizeof(c));
while(c=='#'){
fscanf_s(fd,"%[^\n] ",b,sizeof(b));
printf("%s\n",b);
fscanf_s(fd,"%c",&c,sizeof(c));
}
ungetc(c,fd);
fscanf_s(fd,"%d %d %d",&PWidth,&PHeight,&MaxVal);
PSize=PWidth*PHeight;
image=(GLuint *)malloc(3*sizeof(GLuint)*PSize);
for(i=0;i<PSize;i++){
fscanf_s(fd,"%d %d %d",&red,&green,&blue);
image[3*PSize-3*i-3]=red;
image[3*PSize-3*i-2]=green;
image[3*PSize-3*i-1]=blue;
}
scale=255./MaxVal;
}
init() 函数主要功能:
1、 清除背景颜色为黑色,指定当前绘制颜色为白色;
2、 设置二维纹理映射参数。
void init(void){
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(1.0,1.0,1.0);
glEnable(GL_TEXTURE_2D);
glPixelTransferf(GL_RED_SCALE,scale);
glPixelTransferf(GL_GREEN_SCALE,scale);
glPixelTransferf(GL_BLUE_SCALE,scale);
glPixelStorei(GL_UNPACK_SWAP_BYTES,GL_TRUE);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D,0,3,PHeight,PWidth,0,GL_RGB,GL_UNSIGNED_INT,image);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
}
Quads() 函数主要功能:
1、 绘制四边形
2、 对每个四边形顶点指定一个纹理坐标
void Quads(void){
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);
glVertex2i(0,0);
glTexCoord2f(0.0,1.0);
glVertex2i(0,PWidth-1);
glTexCoord2f(1.0,1.0);
glVertex2i(PHeight-1,PWidth-1);
glTexCoord2f(1.0,0.0);
glVertex2i(PHeight-1,0);
myReshape() 函数主要功能:
1、 响应窗口大小缩放事件
2、 设置窗口中视口的大小和位置
3、 设置正交投影矩阵,投影大小正好是图片的宽度和高度
4、 设置模型视图变换矩阵,并初始化为单位矩阵
glEnd();
}
void myreshape(int w,int h){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLfloat)PWidth,0.0,(GLfloat)PHeight);
glMatrixMode(GL_MODELVIEW);
display() 函数主要功能:
1、 响应窗口显示事件
2、 清除颜色缓冲区内容
3、 绘制带纹理的四边形
4、 立即执行所有OpenGL命令,将图元显示在当前窗口的当前视口中
glLoadIdentity();
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
Quads();
glFlush();
}
int main(int argc,char **argv){
getPic();
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(PWidth,PHeight);
main() 函数主要功能:
1、 为执行文件调用主函数提供唯一入口
2、 调用getPic()函数,设置image纹理数据
3、 初始化OpenGL环境
4、 创建应用程序窗口
5、 注册窗口大小缩放回调函数和显示回调函数
6、 调用init()初始化函数
7、 系统进入窗口事件循环监听状态
glutInitWindowPosition(0,0);
glutCreateWindow("背景图片示例...");
glutReshapeFunc(myreshape);
glutDisplayFunc(display);
init();
glutMainLoop();
}
展开阅读全文