杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx

上传人:b****4 文档编号:5321792 上传时间:2023-05-08 格式:DOCX 页数:18 大小:193.72KB
下载 相关 举报
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第1页
第1页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第2页
第2页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第3页
第3页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第4页
第4页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第5页
第5页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第6页
第6页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第7页
第7页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第8页
第8页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第9页
第9页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第10页
第10页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第11页
第11页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第12页
第12页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第13页
第13页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第14页
第14页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第15页
第15页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第16页
第16页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第17页
第17页 / 共18页
杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx

《杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx》由会员分享,可在线阅读,更多相关《杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx(18页珍藏版)》请在冰点文库上搜索。

杭电《实时三维图形绘制》OpenGL课复习提纲试题展示及参考答案剖析.docx

杭电《实时三维图形绘制》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、分析程序并计算

请看下面的一段程序,并计算三个顶点

处的光照的颜色值。

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);//1

glVertex3f(1.0,0.0,0.0);//2

glVertex3f(1.0,1.0,0.0);//3

glEnd();

glFlush();

}

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

v0.00.01.0

v1.00.01.0

v1.01.01.0

v0.01.01.0

v1.00.00.0

v1.01.00.0

v0.01.00.0

v0.00.00.0

#normals

vn0.00.01.0

vn0.00.0-1.0

vn0.01.00.0

vn0.0-1.00.0

vn1.00.00.0

vn-1.00.00.0

vt0.00.0

vt1.00.0

vt1.01.0

vt0.01.0

#前面1-2-3-4

gposz_map

usemtlposz_map

f1/1/12/2/13/3/64/4/1

#后面5-6-7-8

gnegz_map

usemtlnegz_map

f5/1/26/2/27/3/28/4/2

#上面4-3-6-7

gposy_map

usemtlposz_map

f4/1/33/2/36/3/37/4/3

#下面2-1-8-5

gnegy_map

usemtlnegy_map

f2/1/41/2/48/3/45/4/4

#右面2-5-6-3

gposx_map

usemtlposx_map

f2/1/55/2/56/3/53/4/5

#左面8-1-4-7

gnegx_map

usemtlnegx_map

f8/1/61/2/64/3/67/4/6

a.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.变换矩阵为:

[1000

0100

001-100

0001]

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.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;i

for(j=0;j

c=((((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);

glTexCoord2f(0.0,0.0);glVertex3f(-2.0,-1.0,0.0);

glTexCoord2f(0.0,1.0);glVertex3f(-2.0,1.0,0.0);

glTexCoord2f(1.0,1.0);glVertex3f(0.0,1.0,0.0);

glTexCoord2f(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;

}

}

intmain(intargc,char**argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);

glutInitWindo

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2