OpenGL试题库.docx
《OpenGL试题库.docx》由会员分享,可在线阅读,更多相关《OpenGL试题库.docx(15页珍藏版)》请在冰豆网上搜索。
![OpenGL试题库.docx](https://file1.bdocx.com/fileroot1/2023-1/11/6e917a33-e2cb-4f48-bb14-429173450210/6e917a33-e2cb-4f48-bb14-4291734502101.gif)
OpenGL试题库
OpenGL试题库
一、选择题,每题1分,共10分,
、通过(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)
-90.0,0.0,1.0,0.0)C.glRotatef(
D.glRotatef(90.0,0.0,1.0,0.0)
5、由K个控制顶点Pi(i=1,…k)所决定的n次B样条曲线,由(C)段n次B样条曲线段光滑连
接而成。
A.k-n-2B.k-n-1C.k-nD.k-n+1
1-10
6、使用二维图形变换矩阵:
T=如果图形的一个顶点坐标为A(6,8),则010
001
变换后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.9B.12C.16D.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样条曲线段光滑
连接而成。
A.k-n-2B.k-n-1C.k-nD.k-n+1
0-10
15、使用二维图形变换矩阵:
T=如果图形的一个顶点坐标为A(6,8),则10
01
变换后A’的坐标为(C)。
A((8,-6)B.(-6,8)C.(-8,6)D.(6,-8)6、点P的坐标为(8,6,2),对应的空间齐次坐标为(A)。
1
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.1B.2C.3D.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、仿射变换是操纵几何对象,为场景制作动画效果及获取理想视图的关键,主要有__平移__、__旋转__
和__缩放__。
、OpenGL通过一个综合了__漫反射__、__镜面反射__、__环境光__以及__发射光__等多种因素的光照模15
型来模拟现实世界中我们所看到的颜色。
16、绘制曲线时,通过预先设置的四个控制点,可绘制__贝塞尔曲线__或__插值曲线__或_B样条曲线_。
三、判断题,对的打?
错的打×,每题,分,共,:
分,
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样条曲线可保证连续且光滑。
(?
)
四、程序设计题,共6:
分,
1、右图示的某程序菜单用鼠标右键控制。
要求编写用glut库函数实现该菜单功能的OpenGL程序。
#include
#include
GLintMainMenu,SubMenu1,SubMenu2;
voidSubMenu1_Fun(GLintval){
switch(val){
case1:
printf("这是子菜单Spot的Expoint+
项!
\n\r");
break;
case2:
printf("这是子菜单Spot的EXPOINT-\n\r");
break;
case3:
printf("这是子菜单Spot的
CUTOFF+!
\n\r");
break;
case4:
printf("这是子菜单Spot的CUTOFF-!
\n\r");
break;
default:
printf("这是子菜单Spot的其他项!
\n\r");
}
}
voidSubMenu2_Fun(GLintval){
switch(val){
case1:
printf("这是子菜单Colors的Red!
\n\r");
break;
case2:
printf("这是子菜单Colors的Green!
\n\r");
break;
case3:
printf("这是子菜单Colors的Blue!
\n\r");
break;
default:
printf("这是子菜单Colors的其他项!
\n\r");
}
}
voidMenu_Func(GLintval){
switch(val){
case1:
printf("这是主菜单的Spot\n\r");
break;
case2:
printf("这是主菜单的Colors\n\r");
break;
default:
printf("这是主菜单其他项\n\r");
}
}
voidmyDisp(void){
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
intmain(intargc,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
GLfloatplanes[]={-1.0,0.0,1.0,0.0};GLfloatplanet[]={0.0,-1.0,0.0,1.0};staticGLfloattheata[]={0.0,0.0,0.0};staticGLintaxis=2;
GLubyteimage[64][64][3];
voidinit(void){Init函数主要功能有:
GLinti,j,c;1、初始化图片位图for(i=0;i<64;i++){2、启用深度测试和融合
3、设置解压缩像素贮存格式
4、启用纹理,设置相关参数
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);
}
voidkey(unsignedchark,intx,inty){Key函数主要功能有:
if(k=='1')glutIdleFunc(spinCube);1、响应键盘事件,按键‘1’,开始旋转图形if(k=='2')glutIdleFunc(NULL);2、按键‘2’,停止旋转图形}
voidspinCube(void){spinCube函数主要功能有:
theata[axis]+=2.0;1、改变当前旋转轴旋转角,限制旋转角在0~360度范围内if(theata[axis]>360.0)theata[axis]-=360.0;2、重新刷新当前窗口glutPostRedisplay();
}
voidmouse(intbtn,intstate,intx,inty){
if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)Mouse函数主要功能有:
axis=0;1、响就鼠标事件
if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN)2、通过左中右键改变旋转
axis=1;轴
if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)
axis=2;
}
voidmyReshape(intw,inth){MyReshape函数主要功能有:
glViewport(0,0,w,h);1、响应窗口变化事件glMatrixMode(GL_PROJECTION);2、设置视口位置和大小glLoadIdentity();3、设置正交视景体,确保绘制图形保持刚性变换if(w<=h)4、设置模型视图矩阵glOrtho(5、自动调用display函数-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);
}
voiddisplay(void){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
Display函数主要功能有:
1、清除颜色缓冲区和深度缓冲区内容glRotatef(theata[0],1.0,0.0,0.0);
2、初始化当前矩阵变换glRotatef(theata[1],0.0,1.0,0.0);
3、设置X、Y、Z轴旋转变换矩阵
4、绘制茶壶
5、交换前后台缓存内容,执行所有OpenGL命令,并将最后结果在当前
窗口中显示出来
glRotatef(theata[2],0.0,0.0,1.0);
glutSolidTeapot(1.0);
glutSwapBuffers();
}
voidmain(intargc,char**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("旋转的纹理茶壶...");
glutReshapeFunc(myReshape);Main函数主要功能有:
glutDisplayFunc(display);1、初始化OpenGL环境
glutIdleFunc(spinCube);2、初始化显示模式为双缓存、RGBA颜色和深度测试
glutMouseFunc(mouse);3、初始化创建窗口
glutKeyboardFunc(key);4、注册窗口回调函数、显示回调函数、系统空闲回调函数、鼠标回调函
glClearColor(1.0,1.0,1.0,1.0);数和键盘回调函数
5、调用初始化函数init
init();6、调用窗口消息循环函数,监控窗口事件
glutMainLoop();
}
3、如右图所示,假定将正方形的4个顶点定义为一个单位圆周上的4个等间隔点,试编写OpenGL程序,
使得正文形能按θ角旋转(注意旋转角θ可自定义大小)。
#include
#include
#defineRAD0.017453
GLfloattheata=0.0;
VoidmyDisp(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();
}
VoidmyIdle(void){
Theata+=2.0;
If(theata>360)theata-=360;
glPostRedisplay();
}
Intmain(intargc,char**argv){
glutInit(&argc,argv);
glutInitDisplayModel(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0.0);
glutInitWindowSize(400,300);
glutCreateWindow(“这是一个旋转的矩形!
”);
glutDisplayFunc(myDisp);
glutIdleFunc(myIdle);
glutMainLoop();
}
4、读下面程序,在右边方框处用文字将程序函数模块主要功能描述出来。
,,:
分,
#include
#include
#include
#include
GLintPWidth,PHeight,MaxVal,PSize;GLfloatscale;
GLuint*image;
voidgetPic(void){
getPic()函数主要功能:
GLuinterr;
FILE*fd;1、从PPM文件中获取图片数据,并保存在数组image中;GLinti;2、指定纹理缩放因子scale的大小。
charc;
charb[100];
wchar_td[100];
GLintred,green,