杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案资料.docx
《杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案资料.docx》由会员分享,可在线阅读,更多相关《杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案资料.docx(24页珍藏版)》请在冰豆网上搜索。
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案资料
2016学年杭州电子科技大学
《及时三维图像绘制》考试
红色标志表示考到了,都是简答题,有超纲的(老师给的纲要)
超纲题:
【1】写出起码三种OpenGL矩阵货仓,并说明作用?
【2】请完好写出用glut和OpenGL编写的程序:
绘制一个平面正三角形,使它绕着过它中心的垂直于平面的轴自动旋转。
1、OpenGL中能衬着的基本元素是什么?
GLU能够衬着哪些基本元素?
答:
OPENGL基本元素:
GL_POINTS、
GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP
GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN
GL_QUADS、GL_QUAD_STRIP、GL_POLYGON
GLU基本元素:
NURBS曲线曲面,二次曲面等
2、简述OpenGL函数的语法特色?
答:
OpenGL函数从前缀gl开头,并把构成函数的每个单词首字母用大写形式表示(如glClearColor)。
近似地,还定义了一些从前缀GL_开头的常量,全部单词都使用大写形式,并以下划线分开(如GL-COLOR-BUFFER-BIT)。
3、用框图说明OpenGL的衬着流程,并简要说明每个坐标系。
物体坐标
视觉坐标
裁剪坐标
设施坐标
模型视图变换
投影变换
透视除法
物体空间
视点空间
裁剪空间
归一化设施空间
视口变换
光栅化
帧缓冲区片元测试片元办理屏幕空间
窗口坐标
4、写出OpenGL中局部光照的方程,要包含的系数有光源参数、资料参数、聚光灯的参数、衰减参数等,方程要表示是多个光源的。
答:
极点颜色=极点处的资料发射颜色+全局环境光(在极点处依据资料环境颜色属性进行缩放)+经过适合衰减的来自全部光源的环境、散射、镜面光成分
5、在OpenGL中,使用光照的步骤是什么?
答:
1、定义每个物体的每个极点的法线向量。
2、创立和选择一个或多个光源,并设置它们的地点。
3、创立和选择一种光照模型。
4、定义场景中物体的资料属性。
6、剖析程序并计算
请看下边的一段程序,并计算三个极点○1、○2和○3处的光照的颜色值。
voidinit(void)
{
GLfloatmat_ambient[]={0.2,0.2,0.2,1.0};
GLfloatmat_diffuse[]={0.8,0.8,0.8,1.0};
GLfloatmat_emission[]={0.0,0.0,0.0,1.0};
GLfloatmat_specular[]={0.3,0.3,0.3,1.0};
GLfloatmat_shininess[]={2.0};
GLfloatlight_position[]={1.0,1.0,1.0,0.0};
GLfloatlight_ambient[]={0.2,0.2,0.2,1.0};
GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};
GLfloatlight_specular[]={1.0,1.0,1.0,1.0};
GLfloatlmodel_ambient[]={0.2,0.2,0.2,1.0};
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glBegin(GL_TRIANGLES);
glNormal3f(0.0f,0.0f,1.0f);
glVertex3f(0.0,0.0,0.0);
glVertex3f(1.0,0.0,0.0);
glVertex3f(1.0,1.0,0.0);
glEnd();
glFlush();
//1
//2
//3
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return0;
}
答:
把各个参数带到第四题的公式里,不要求算出结果
7、在OpenGL中,使用纹理的步骤是什么?
纹理坐标和纹理都能够经过程序计算出来,自动生成纹理的原理是什么?
答:
步骤:
1、创立纹理对象,并为它指定一个纹理。
2、确立纹理怎样应用到每个像素上。
3、启用纹理贴图功能。
4、绘制场景,供给纹理坐标和几何图形坐标。
原理:
自动生成纹原因glTexGen()函数来实现。
要自动生成纹理坐标,第一要指
定以什么样的模式来生成纹理坐标。
纹理坐标生成模式有:
GL_OBJECT_LINEAR、GL_EYE_LINEAR、GL_SPHERE_MAP、
GL_REFLECTION_MAP和GL_NORMAL_MAP.
1.GL_OBJECT_LINEAR
在这个模式下,其纹理生成函数是极点(x0,y0,z0,w0)的物体坐标的线性组合:
生成的坐标=p0*x0+p1*y0+p2*z0+p3*w0;
此中p0,p1,p2,p3的值是由glTexGen*v()函数的param参数供给的。
2.GL_EYE_LINEAR
在这个模式下,其纹理生成函数是极点的视觉坐标(xe,ye,ze,we)的线性组合:
生成的坐标=p0'*xe+p1'*ye+p2'*ze+p3'*we;
此中p0’,p1’,p2’,p3’的值是由glTexGen*()函数的param参数供给的。
3.GL_SPHERE_MAP和GL_REFLECTION_MAP
主要用于生成球体纹理
4.GL_NORMAL_MAP
主要用于生建立方图纹理
8、帧缓存有几种,什么叫片元,片元的测试和操作有哪些?
【超纲】每种有什么作用?
答:
帧缓存有:
颜色缓存、深度缓存、模板缓存、积累缓存。
片元:
图元光栅化的结果,每个片元都对应于一个像素,包含颜色、深度,有时还包含纹理坐标。
片元的测试:
裁剪测试、alpha测试、模板测试、深度测试;操作有:
混淆、颤动、逻辑操作。
9、采纳GPU编程,请说明VertexShader和FragmentShader的输入输出坐标系是什么?
输入输出的主要参数是什么?
答:
在VertexShader中的输入座标为局部坐标系(模型坐标系),输出坐标为裁剪坐标系。
FragmentShader的输入为极点管线输出的迭代值,包含纹理坐标、颜色信息等,输出为片元最后的颜色、深度以及输出到多个缓冲区。
10、怎样实现纹理的反走样?
说明其原理。
答:
Mipmap技术能够实现纹理反走样,其指定一系列早先过滤的分辨率递减的纹理图像,在使用mipmap时,它会依据被贴图的物体大小自动确立使用哪个纹理。
经过这类方法,纹理图像中的细节层就能适应绘制到屏幕上的图像。
11、写出场景的反走样算法,并说明其原理。
答:
对场景的反走样,往常采纳多重采样的方法,即便用额外的颜色,深度和模板信息对图元进行抗锯齿办理。
每个片元根椐子像素样本的数目和信息来计算,也就是依据一个多重采样缓冲区所保留的样原来计算。
还有一种扰动视点的方法,也就是多次绘制这个场景,每次绘制时,对视点进行颤动,作必定稍微的偏移,当整个衬着过程结束后,再把全部图象叠加起来,因为每个图象的地点不一样,能够减少锯齿状。
12、请列举出3种以上的三维模型常有的表示格式,已知一个立方体环境映照
对应的六个面上的图片,分别假设为X_POSITVIE_PIC,X_NEGATIVE_PIC,
Y_POSITIVE_PIC,Y_NEGATIVE_PIC,Z_POSITIVE_PIC,Z_NEGATIVE_PIC
,请用OBJ格式表示一个长度为1的立方体,并把每个面分别贴上给定的六个图片。
答:
三种常有格式:
.obj.x.3ds.off
#vertices
v
0.0
0.0
1.0
v
1.0
0.0
1.0
v
1.0
1.0
1.0
v
0.0
1.0
1.0
v
1.0
0.0
0.0
v
1.0
1.0
0.0
v
0.0
1.0
0.0
v0.00.00.0
#normals
vn0.0
0.0
1.0
vn0.0
0.0
-1.0
vn0.0
1.0
0.0
vn0.0
-1.0
0.0
vn1.0
0.0
0.0
vn-1.0
0.0
0.0
vt0.00.0
vt1.00.0
vt1.01.0
vt0.01.0
#前面1-2-3-4
gposz_mapusemtlposz_map
f1/1/12/2/13/3/64/4/1
#后边5-6-7-8
gnegz_mapusemtlnegz_map
f5/1/26/2/27/3/28/4/2
#上边4-3-6-7
gposy_mapusemtlposz_map
f4/1/33/2/36/3/37/4/3
#下边2-1-8-5
gnegy_mapusemtlnegy_map
f2/1/41/2/48/3/45/4/4
#右边2-5-6-3
gposx_mapusemtlposx_map
f2/1/55/2/56/3/53/4/5
#左面8-1-4-7
gnegx_mapusemtlnegx_map
f8/1/61/2/64/3/67/4/6a.mtl
newmtlposx_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdX_POSITVIE_PIC.jpg
newmtlnegx_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdX_NEGATIVE_PIC.jpg
newmtlposy_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdY_POSITIVE_PIC.jpg
newmtlnegy_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdY_NEGATIVE_PIC.jpg
newmtlposz_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdZ_POSITIVE_PIC.jpg
newmtlnegz_map
Ka0.9686000.9686000.968600
Kd0.9686000.9686000.968600
Ks0.9000000.9000000.900000
map_KdZ_NEGATIVE_PIC.jpg
12、在一个坐标系W中,设模型为一个以(5.0,0.0,0.0),(0.0,5.0,0.0),(0.0,0.0,5.0)
为三个点的三角形,此刻把照相机依据以下方式设置:
照相机地点设为:
(0.0,0.0,
100.0),看向的目标点为
(0.0,0.0,0.0),照相机
的up方向为(0.0,1.0,0.0)
投影为透视投影,竖直张角为
60度
取景范围为沿照相机的朝向距离从
0.1到300
现需要把照相机看到的图片放在一个400x300像素分辨率的窗口的右上部分,该部分开端点为(100,100),宽度为200,高度为200
(1)请写出用OpenGL函数表示的照相机设置。
(2)写出视区(viewport)的设置函数。
(3)写出投影变换的设置函数。
(4)求出从坐标系W到照相机坐标系(视点坐标系)的4x4的变换矩阵。
答:
1.gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0,0.0,1.0,0.0);
2.glViewport(100,100,200,200);
3.gluPerspective(60.0f,1.0f,0.1f,300.0f);
4.变换矩阵为:
[1
0
0
0
0
1
0
0
0
0
1
-100
0
0
0
1
]
voidreshape()
{
glViewport(100,100,200,200);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,1.0,0.1,300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
13、剖析下边的程序并计算在下边的例子中,计算对应○1○2○3○4四个极点所对应
的四边形上的一个点(-1.0,0.5,0.0)对应的纹理坐标是多少?
依据近来邻域滤波方法,该点对应的颜色是什么?
/*Createcheckerboardtexture*/
#definecheckImageWidth64
#definecheckImageHeight64
staticGLubytecheckImage[checkImageHeight][checkImageWidth][4];
#ifdefGL_VERSION_1_1
staticGLuinttexName;
#endif
voidmakeCheckImage(void)
{
inti,j,c;
for(i=0;ifor(j=0;jc=((((i&0x8)==0)^((j&0x8))==0))*255;
checkImage[i][j][0]=(GLubyte)c;
checkImage[i][j][1]=(GLubyte)c;
checkImage[i][j][2]=(GLubyte)c;
checkImage[i][j][3]=(GLubyte)255;
}
}
}
voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
#ifdefGL_VERSION_1_1
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_2D,texName);
#endif
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
#ifdefGL_VERSION_1_1
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,checkImageWidth,checkImageHeight,
0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);
#else
glTexImage2D(GL_TEXTURE_2D,0,4,checkImageWidth,checkImageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);
#endif
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);#ifdefGL_VERSION_1_1
glBindTexture(GL_TEXTURE_2D,texName);
#endif
glBegin(GL_QUADS);
○1glTexCoord2f(0.0,0.0);glVertex3f(-2.0,-1.0,0.0);
○2glTexCoord2f(0.0,1.0);glVertex3f(-2.0,1.0,0.0);
○3glTexCoord2f(1.0,1.0);glVertex3f(0.0,1.0,0.0);
○4glTexCoord2f(1.0,0.0);glVertex3f(0.0,-1.0,0.0);
glTexCoord2f(0.0,0.0);glVertex3f(1.0,-1.0,0.0);glTexCoord2f(0.0,1.0);glVertex3f(1.0,1.0,0.0);glTexCoord2f(1.0,1.0);glVertex3f(2.41421,1.0,-1.41421);glTexCoord2f(1.0,0.0);glVertex3f(2.41421,-1.0,-1.41421);glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-3.6);
}
voidkeyboard(unsignedcharkey,intx,inty)
{
switch(key){
case27:
exit(0);
break;
default:
break;
}
}
int