杭电OpenGl学期考试复习题
杭州电子科技大学 OpenGL 学期考试复习题1、 OpenGL 中渲染的基本元素是什么? GLU 可以渲染哪些基本元素?OpenGL中能渲染的基本元素是什么? ( 曲面 ) OPENGL基本元素:GL_POINTS GL_LINES GL_POLYGON GL_LINE_STRIP GL_LINE_LOOP GL_TRANGLES GL_TRANGLE_STRIP GL_TRANGLE_FAN GL_QUADS GL_QUAD_STRIP GLU基本元素 :NUBRS曲线曲面 , 二次曲面等2.用框图说明 OpenGL 的渲染流程,并简要说明每个坐标系。3. 写出 OpenGL 中局部光照的方程,要包含的系数有光源参数、材料参数、聚光灯的参数、衰减参数等,方程要表示是多个光源的。Norm(X): 单位化 X N:顶点的单位化法向量V: 聚光灯指向顶点的单位向量D:聚光灯的方向向量,它是单位向量T: 顶点到光源的单位向量,当光源是聚光灯时,即为 -V P: 顶点到视点的单位向量S:Norm(T+P) 视点空间光照计算投影变换裁剪空间除法标准坐标系ViewPort 屏幕空间光栅化片元处理提取纹理单元用于纹理应用 ; 纹理坐标计算,采样纹理应用 ; 法向量计算 ; fog; 主颜色辅颜色混合片元测试模型视图变换裁切测试Alpha 测试模版测试深度测试帧缓存区顶点顶点颜色 =材料自发光 + 环境光颜色 * 材料的环境颜色属性 + 对每个聚光灯加上(聚光灯衰减因子 * 聚光灯的效果) * 【光源的环境颜色 * 材料的环境颜色 + 取 MaxL*n,0* 漫反射光颜色 * 材料的漫反射属性 + 取( MaxS*N,0 ) shininess * 灯的反射值 * 材料的反射属性】其中 shininess 为镜面反射指数后半部分即:每个光源的贡献 =衰减因子 * 聚光灯效果 * (环境光成分 +漫反射成分 +镜面反射成分)聚光的衰减因子 = 聚光灯效果:光源不是聚光灯,取 1 光源是聚光灯但是顶点位于光源外,取 0 其它: ( MaxV*D,0 ) exp (exp 为镜面反射指数值 ) 5. 在 OpenGL 中,使用纹理的步骤是什么?纹理坐标和纹理都可以通过程序计算出来,自动生成纹理的原理是什么?步骤: 1、创建纹理对象,并为它指定一个纹理。2、确定这个纹理如何应用到每个象素上。3、启用纹理贴图功能。4、绘制场景,提供纹理坐标和几何图形坐标。要完成自动纹理坐标的生成,首先要指定以什么样的模式(既什么样的算法)来生成纹理坐标。可以指定三种纹理坐标生成模式 :GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP 。为了自动生成纹理,可以使用 glTexGen 函数,当纹理图像与移动的物体保持固定时,在物体坐标中指定参考平面是最合适的;为了产生移动物体的动态轮廓线,在视觉坐标中指定参考平面是最为合适的6、 .帧缓存有几种,什么叫片元。片元的测试和操作有哪些?颜色缓存:包括左前,右前,左后,右后及任意数量的辅助颜色缓存。深度缓存 ,模板缓存,累积缓存。片元:光栅化时处理的基本单位(像素) ,包括了点的法线,坐标,贴图坐标等信息。片元的测试按下列的顺序进行,如果在前面的测试中片元被删除,则不在进行后续的测试或操作。1. 剪取测试:利用 glScissor() 函数定义窗口中的一个矩形,并将图限制在其中。2. alpha 测试:利用 alpha 值来确定或是拒绝一个片元。利用 glEnable() 使用参数 GL_ALPHA_TEST激活。哟哦那个 glAlphaFunc() 来比较。用来实现透明算法和纹理图制作贴花。3. 模板测试:对存储于模板缓存中的像素值与参考值进行比较,根据比较的结果来对模板缓存中的值进行修改。 glStencilOp(). 4. 深度测试:用于消除隐藏表面的操作。 glDepthFunc() 来设置比较函数。5. 操作:混合、抖动、逻辑明白 stencilbuffer(模板缓冲区)的使用。模板测试常用的是屏蔽掉屏幕中一些不规则的区域, 以免在这些区域中进行绘图。 使用 glStencilFunc()和 glStencilOp() 函数选择需要使用的特定比较函数,参考值以及对模板缓冲区所执行的修改操作。模板测试的结果决定了像素的颜色值是否要被写入到渲染目标, 像素的深度值是否要被写入深度缓冲。例如,当参考模板值为 0 时将一些物体绘制到场景中,而此时模板缓冲已经清除为 1,那么当绘制这些物体时模板缓冲就会为 0。如果接着将参考值设置为 1,而且 StencilFunction 设置为CompareFunction.LessEqual , 那么只有那些模板值不为 0 的对应区域的像素会被绘制。 这是使用模板21dkdkk qlc缓冲创建一个限制当前绘制区域的基本用法。要使用模板缓冲, DepthFormat 必须保留一些字节用于模板缓冲。 用 stencilbuffer 编程实现一个功能。 镜面功能:实现此功能需要进行两次绘制,首先对所有非镜像物体进行绘制,这个时候不需要对模板缓冲进行任何修改 ;之后绘制镜面,不过是绘制在模板缓冲上,表示只有镜子之块区域在下一次绘制的时候可以通过模板测试,之后对所有的镜像物体(当然需要对所有物体进行镜像变换,即点减去表示此点到镜像平面最短距离的向量的两倍,镜像矩阵根据上面的所述推出)进行绘制,由于我们设置了模板缓冲,故这一次绘制只会绘制在镜子所覆盖的那块区域,于是,我们的镜像效果就出来了。7. 采用 GPU 编程,请说明 Vertex Shader 和 Fragment Shader 的输入输出坐标系是什么 ? 输入输出的主要参数是什么? 如何实现 Multi-Pass 渲染?1)在 Vertex Shader input: 顶点坐标,法线向量,颜色值,纹理坐标,雾坐标输出:图元设置,裁剪。Fragment Shader input :几何图形设置开始,位图 / 像素矩阵output :片段测试 帧缓冲区 创建 shade project,program link,gluseshader 2)3) Multi-pass 渲染可以对同一帧进行多遍渲染。这样可以准确渲染景深( Depth of Field)和对象运动模糊( Object Motion Blur ) 。 打开 Enable 将激活 Multi-Pass 渲染效果 .Multi-Pass 效果有 Depth Of Field(mental ray) 、Depth of Field 效果和 Motion Blur 效果三种选择,默认使用 Depth of Field 效果。8、 如何实现纹理的反走样?说明其原理。采样不充分造成纹理的反走样。 可以通过 Mipmap 的方法来减轻纹理的走样。 Mipmap 是一系列预先过滤的分辨率递减的纹理图像。在 OPENGL 使用 Mipmap 时,会根据被贴图的物体大小自动确定使用那个纹理。使用这种方法,纹理图像中的细节层就能适应地被绘制到屏幕上的图像。生成 Mipmap 时,较小的图像通常是进行了过滤的版本,是对最大的纹理图像进行适当匀缩后的结果,一般而言,较小的纹理图像的每个纹理单元是更高一级分辨率的纹理图像的 4 个纹理单元的平均值。9、写出场景的反走样算法,并说明其原理。对场景的反走样,通常采用多重采样的方法。多重采样的方法使用额外的颜色,深度和模版信息对图元进行反走样处理。每个片元是根椐子像素样本的数量和信息来计算,也就是根据一个多重采样缓冲区所保存的样本来计算。一种是扰动视点的方法,也就是多次绘制这个场景,每次绘制时,对视点进行抖动,作一点轻微的偏移,当整个渲染过程完结后,再把所有图象叠加起来 ,由于每个图象的位置不同,可以减轻锯齿状。10.请用 OBJ 格式表示一个长度为 10 的立方体,并把每个面分别贴上图片文件 pic1.jpg , pic2.jpg, pic3.jpg, pic4.jpg, pic5.jpg 、 pic6.jpg。三种常见格式: .obj .x .3ds .vrml a.obj mtllib a.mtl # 8 vertices v 0.0 0.0 0.0 v 0.0 10.0 0.0 v 0.0 10.0 10.0 v 0.0 0.0 10.0 v 10.0 0.0 0.0 v 10.0 10.0 0.0 v 10.0 10.0 10.0 v 10.0 0.0 10.0 #normals nv 0.0 0.0 1.0 nv 0.0 0.0 -1.0 nv 0.0 1.0 0.0 nv 0.0 -1.0 0.0 nv 1.0 0.0 0.0 nv -1.0 0.0 0.0 vt 0.0 0.0 vt 1.0 0.0 vt 1.0 1.0 vt 1.0 1.0 g posx_map usemtl posx_map f 4/1/6 2/2/6 1/3/6 3/4/6 g posy_map usemtl posy_map f 2/1/4 6/2/4 5/3/4 1/4/4 g negx_map usemtl negx_map f 6/1/5 8/2/5 7/3/5 5/4/5 g negy_map usemtl negy_map f 8/1/3 4/2/3 3/3/3 7/4/3 g posz_map usemtl posz_map f 7/1/2 3/2/2 1/3/2 5/4/2 g negz_map usemtl negz_map a. mtl newmtl posx_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic1.jpg newmtl posy_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic2.jpg newmtl posz_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic3.jpg newmtl negx_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic4.jpg newmtl negy_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic5.jpg newmtl negz_map Ka 0.968600 0.968600 0.968600 Kd 0.968600 0.968600 0.968600 Ks 0.900000 0.900000 0.900000 map_Kd pic6.jpg