OpenGL 期末考试作业

这篇博客详细介绍了OpenGL的基本元素、渲染引擎、矩阵堆栈、纹理应用步骤、Mipmap的作用以及反混淆技术。内容包括OpenGL中的纹理类型、模型视图变换、光照方程、GLSL编程、帧缓冲和模板缓冲的使用,以及反走样方法。同时,通过实例展示了纹理坐标计算和颜色获取的过程。
摘要由CSDN通过智能技术生成
                1、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、常见的渲染引擎有哪些?举例说明这些实时渲染引擎的主要功能。

答:常见的渲染引擎有:Direct3D(微软),OpenGL ,Delta3d
OpenGL提供了大量的实用基本操作函数。如几何建模、变换、渲染、光照和材质、反走样、混合、雾化、位图和图像、纹理映射、交互和动画等。OpenGL具有的主要优点如下:平台无关性。OpenGL是一个硬件与图形的软件接口,实际上就是一个三维图形和模型库,可以在任意平台和操作系统上运行。硬件加速性。OpenGL的应用程序接口属于低层的和面向图形硬件的软件接口,因此许多算法可以通过硬件实现。目前几乎所有的三维图形加速卡都具有OpenGL加速功能。网络开放性。OpenGL工作在客户机/服务器模式下,客户机与服务器可以是各种不同的计算机和外设,只要两者之间服从相同的协议。这使得用户能够十分方便的在网络环境下使用OpenGL。
DirectX它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。
Delta3D是一款由美国海军研究学院开发的全功能游戏与仿真引擎。是一个功能齐全的游戏引擎,可用于游戏,模拟或其他图形应用。

3、可以使用的矩阵堆栈有哪些?

答:模型视点矩阵,投影矩阵,颜色矩阵(应该还有一个纹理矩阵)

4、说明使用纹理的步骤。

步骤:1、创建纹理对象,并为它指定一个纹理。

      2、确定这个纹理如何应用到每个象素上。

      3、启用纹理贴图功能。

      4、绘制场景,提供纹理坐标和几何图形坐标。

投影纹理:通过应用一系列的变换,可以把物体坐标中的坐标映射到一个2D空间(纹理空间)中,并找出每个顶点映射到纹理的哪个部分,然后把这个位置当作纹理坐标给顶点。变换的过程是将物体坐标进行MODEL变换统一到一个世界坐标系,再进过Projector的VIEW矩阵变换投影的视点(Projector  View)空间下,然后通过透视矩阵,最后要进行一部缩放和偏移的变换,这样就生成了它的投影纹理。

多重纹理:多重纹理是指对一个多边形映射多个纹理。在纹理映射的过程中,对各个纹理单元中的纹理,通过纹理组合函数,逐个应用到多边形上。使用多重纹理时,有多个纹理单元和多个纹理坐标,OPENGL渲染时对每个纹理进行单独的纹理操作,并把结果传递到下一个纹理单元中,即每个纹理单元根据它的纹理状态,把原来的片元颜色与纹理单元中的图像以一定的方式进行组合,把把产生的片元颜色传递到下一个纹理单元,在纹理组合时,OPENGL通过指定的纹理组合函数,如GL_REPLACE,GL_ADD,GL_MODULATE等方式。

5、Mipmap的作用是什么?为什么mipmap可以用来纹理反混淆。

(如何实现纹理的反走样?说明其原理。)

Mipmap是一系列预先过滤的分辨率递减的纹理图像。

在OPENGL使用Mipmap时,会根据被贴图的物体大小自动确定使用那个纹理。使用这种方法,纹理图像中的细节层就能适应地被绘制到屏幕上的图像。生成Mipmap时,较小的图像通常是进行了过滤的版本,是对最大的纹理图像进行适当匀缩后的结果,一般而言,较小的纹理图像的每个纹理单元是更高一级分辨率的纹理图像的4个纹理单元的平均值。

6、写出OpenGL中局部光照的方程,要包含的系数有光源参数、材料参数、聚光灯的参数、衰减参数等,方程要表示是多个光源的。

7、如何理解模型视图变换?在一个坐标系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)     写出投影变换的设置函数。

opengl 期末复习资料 第一、二章: 1、 OpenGL中能渲染的基本元素是什么?GLU 可以渲染哪些基本元素? 第三章 2、 用框图说明OpenGL的渲染流程,并简要说明每个坐标系。 第四、五章 3、 写出OpenGL中局部光照的方程,要包含的系数有光源参数、材料参数、聚光灯的参数、衰减参数等,方程要表示是多个光源的。 4、 分析程序并计算 请看下面的一段程序,并计算三个顶点○1、○2和○3处的光照的颜色值。 void init(void) { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); //glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); //glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glNormal3f(..); ○1glVertex3f(1.0, 0.0, 0.0); ○2glVertex3f(0.0, 1.0, 0.0); ○3glVertex3f(0.0, 0.0, 1.0); glEnd(); glFlush (); } void reshape (int w, int h) { 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(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, 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); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } 第9章 在OpenGL中,使用纹理的步骤是什么?纹理坐标和纹理都可以通过程序计算出来,自动生成纹理的原理是什么? 第10章 帧缓存有几种,什么叫片元,片元的测试和操作有哪些? 明白stencilbuffer的使用。 用stencilbuffer编程实现一个功能。 5、 采用GPU编程,请说明Vertex Shader 和 Fragment Shader 的输入输出坐标系是什么? 输入输出的主要参数是什么? 如何实现Multi-Pass 渲染? 6、 在一个坐标系W中,光源的位置为 (0, 0, 200, 1.0),设模型为一个以(1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0)为三个点的三角形,另一个模型是以(0, 0, 10)为中心,长度为2的一个正方体,如何实现该正方体在三角形平面上的阴影?如何使用OpenGL函数来实现?要求在照相机改变时,该程序应该仍然有效。 7、 如何实现纹理的反走样?说明其原理。 8、 写出场景的反走样算法,并说明其原理。 9、 如何实现采用立方体映射实现的环境映射,写出立方体映射的生成算法和把其作为环境映射时显示的程序。 10、 请列举出3种以上的三维模型常见的表示格式,已知一个立方体环境映射对应的六个面上的图片,分别假定为X_POSITVIE_PIC, X_NEGATIVE_PIC, Y_POSITIVE_PIC, Y_NEGATIVE_PIC, Z_POSITIVE_PIC, Z_NEGATIVE_PIC,请用OBJ格式表示一个长度为1的立方体,并把每个面分别贴上给定的六个图片。 11、 分析下面的程序并计算 在下面的例子中,计算对应○1○2○3○4四个顶点所对应的四边形上的一个点(-1.0, 0.5, 0.0)对应的纹理坐标是多少?按照最近邻域滤波方法,该点对应的颜色是什么? /* Create checkerboard texture */ #define checkImageWidth 64 #define checkImageHeight 64 static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; #ifdef GL_VERSION_1_1 static GLuint texName; #endif void makeCheckImage(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; 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; } } } void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); makeCheckImage(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); #ifdef GL_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); #ifdef GL_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 } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); #ifdef GL_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); } void reshape(int w, int h) { 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); } void keyboard (unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } Deferred shading 原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值