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、常見的渲染引擎有哪些?舉例說明這些實(shí)時(shí)渲染引擎的主要功能。
答:常見的渲染引擎有:Direct3D(微軟),OpenGL ,Delta3d OpenGL提供了大量的實(shí)用基本操作函數(shù)。如幾何建模、變換、渲染、光照和材質(zhì)、反走樣、混合、霧化、位圖和圖像、紋理映射、交互和動畫等。 OpenGL具有的主要優(yōu)點(diǎn)如下: 平臺無關(guān)性。OpenGL是一個硬件與圖形的軟件接口,實(shí)際上就是一個三維圖形和模型庫,可以在任意平臺和操作系統(tǒng)上運(yùn)行。 硬件加速性。OpenGL的應(yīng)用程序接口屬于低層的和面向圖形硬件的軟件接口,因此許多算法可以通過硬件實(shí)現(xiàn)。目前幾乎所有的三維圖形加速卡都具有OpenGL加速功能。 網(wǎng)絡(luò)開放性。OpenGL工作在客戶機(jī)/服務(wù)器模式下,客戶機(jī)與服務(wù)器可以是各種不同的計(jì)算機(jī)和外設(shè),只要兩者之間服從相同的協(xié)議。這使得用戶能夠十分方便的在網(wǎng)絡(luò)環(huán)境下使用OpenGL。 DirectX它可讓以windows為平臺的游戲或多媒體程序獲得更高的執(zhí)行效率,加強(qiáng)3d圖形和聲音效果,并提供設(shè)計(jì)人員一個共同的硬件驅(qū)動標(biāo)準(zhǔn),讓游戲開發(fā)者不必為每一品牌的硬件來寫不同的驅(qū)動程序,也降低用戶安裝及設(shè)置硬件的復(fù)雜度。 Delta3D是一款由美國海軍研究學(xué)院開發(fā)的全功能游戲與仿真引擎。是一個功能齊全的游戲引擎,可用于游戲,模擬或其他圖形應(yīng)用。3、可以使用的矩陣堆棧有哪些?
答:模型視點(diǎn)矩陣,投影矩陣,顏色矩陣(應(yīng)該還有一個紋理矩陣)
4、說明使用紋理的步驟。
步驟:1、創(chuàng)建紋理對象,并為它指定一個紋理。
????? 2、確定這個紋理如何應(yīng)用到每個象素上。
????? 3、啟用紋理貼圖功能。
????? 4、繪制場景,提供紋理坐標(biāo)和幾何圖形坐標(biāo)。
投影紋理:通過應(yīng)用一系列的變換,可以把物體坐標(biāo)中的坐標(biāo)映射到一個2D空間(紋理空間)中,并找出每個頂點(diǎn)映射到紋理的哪個部分,然后把這個位置當(dāng)作紋理坐標(biāo)給頂點(diǎn)。變換的過程是將物體坐標(biāo)進(jìn)行MODEL變換統(tǒng)一到一個世界坐標(biāo)系,再進(jìn)過Projector的VIEW矩陣變換投影的視點(diǎn)(Projector? View)空間下,然后通過透視矩陣,最后要進(jìn)行一部縮放和偏移的變換,這樣就生成了它的投影紋理。
多重紋理:多重紋理是指對一個多邊形映射多個紋理。在紋理映射的過程中,對各個紋理單元中的紋理,通過紋理組合函數(shù),逐個應(yīng)用到多邊形上。使用多重紋理時(shí),有多個紋理單元和多個紋理坐標(biāo),OPENGL渲染時(shí)對每個紋理進(jìn)行單獨(dú)的紋理操作,并把結(jié)果傳遞到下一個紋理單元中,即每個紋理單元根據(jù)它的紋理狀態(tài),把原來的片元顏色與紋理單元中的圖像以一定的方式進(jìn)行組合,把把產(chǎn)生的片元顏色傳遞到下一個紋理單元,在紋理組合時(shí),OPENGL通過指定的紋理組合函數(shù),如GL_REPLACE,GL_ADD,GL_MODULATE等方式。
5、Mipmap的作用是什么?為什么mipmap可以用來紋理反混淆。
(如何實(shí)現(xiàn)紋理的反走樣?說明其原理。)
Mipmap是一系列預(yù)先過濾的分辨率遞減的紋理圖像。
在OPENGL使用Mipmap時(shí),會根據(jù)被貼圖的物體大小自動確定使用那個紋理。使用這種方法,紋理圖像中的細(xì)節(jié)層就能適應(yīng)地被繪制到屏幕上的圖像。生成Mipmap時(shí),較小的圖像通常是進(jìn)行了過濾的版本,是對最大的紋理圖像進(jìn)行適當(dāng)勻縮后的結(jié)果,一般而言,較小的紋理圖像的每個紋理單元是更高一級分辨率的紋理圖像的4個紋理單元的平均值。
6、寫出OpenGL中局部光照的方程,要包含的系數(shù)有光源參數(shù)、材料參數(shù)、聚光燈的參數(shù)、衰減參數(shù)等,方程要表示是多個光源的。
7、如何理解模型視圖變換?在一個坐標(biāo)系W中,設(shè)模型為一個以(5.0, 0.0, 0.0), (0.0, 5.0, 0.0), (0.0, 0.0, 5.0)為三個點(diǎn)的三角形,現(xiàn)在把照相機(jī)按照下列方式設(shè)置:
- 照相機(jī)位置設(shè)為:(0.0, 0.0, 100.0),看向的目標(biāo)點(diǎn)為 (0.0, 0.0, 0.0) ,照相機(jī)的up方向?yàn)?#xff08;0.0, 1.0, 0.0)
- 投影為透視投影,豎直張角為60度
- 取景范圍為沿照相機(jī)的朝向距離從0.1 到? 300
現(xiàn)需要把照相機(jī)看到的圖片放在一個400x300像素分辨率的窗口的右上部分,該部分起始點(diǎn)為 (100, 100), 寬度為200,高度為200
(1)???? 請寫出用OpenGL函數(shù)表示的照相機(jī)設(shè)置。
(2)???? 寫出視區(qū)(viewport)的設(shè)置函數(shù)。
(3)???? 寫出投影變換的設(shè)置函數(shù)。
(4)???? 求出從坐標(biāo)系W到照相機(jī)坐標(biāo)系(視點(diǎn)坐標(biāo)系)的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? ]
8、采用GLSL語言如何進(jìn)行編程,Vertex Shader 和 Fragment Shader 的輸入輸出
GLSL(GL Shading Language)是用來在頂點(diǎn)和像素著色器(shader)中編程的語言,編寫的程序段是在圖形卡的GPU(Graphic Processor Unit圖形處理單元)上執(zhí)行的,代替了固定的渲染管線的一部分。比如:視圖轉(zhuǎn)換、投影轉(zhuǎn)換等。GLSL的著色器代碼分成2個部分:Vertex Shader(頂點(diǎn)著色器)和Fragment Shader(片斷著色器)。
頂點(diǎn)著色器控制頂點(diǎn)坐標(biāo)轉(zhuǎn)換過程;片段著色器控制像素顏色計(jì)算過程。
在Vertex Shader中的輸入坐標(biāo)為局部坐標(biāo)系(模型坐標(biāo)系),輸出坐標(biāo)為經(jīng)過ModelView,ProjectionMatrix后的裁剪坐標(biāo)系。
Fragment Shader 的輸入通常為紋理坐標(biāo)、光照信息等,輸出為最后計(jì)算出的顏色值
輸入輸出的主要參數(shù)包括Vertex,Normal,Color, Position以及Material等信息。
9、用框圖說明OpenGL的渲染管線,并簡要說明頂點(diǎn)變換中的每個坐標(biāo)系。
見書。
10、分析程序并計(jì)算
請看下面的一段程序,并計(jì)算三個頂點(diǎn)1、2和3處的光照的顏色值。必須寫出過程,只有結(jié)果不得分。
#include <GL/glut.h>void init(void) {GLfloat mat_ambient[] = { 0.2, 0.2, 0.2, 1.0 };GLfloat mat_diffuse[] = { 0.8, 0.8, 0.8, 1.0 };GLfloat mat_emission[] = { 0.0, 0.0, 0.0, 1.0 };GLfloat mat_specular[] = { 0.3, 0.3, 0.3, 1.0 };GLfloat mat_shininess[] = { 2.0 };GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};GLfloat light_specular[] ={1.0, 1.0, 1.0, 1.0};GLfloat lmodel_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); } void display(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); //1glVertex3f(1.0, 0.0, 0.0); //2glVertex3f(1.0, 1.0, 0.0); //3glEnd();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);elseglOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); } 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);glutMainLoop();return 0; }??? 因?yàn)?? GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
?????? 故L=G((1,1,1));
?????? n=G((0,0,1));s=G(L+(0,0,1)); kc=1,kl=kq=0,N=1聚光效果的1;
11、請用OBJ格式表示一個長度為10的立方體,并把每個面分別貼上圖片文件pic1.jpg,pic2.jpg, pic3.jpg, pic4.jpg, pic5.jpg。
12、常見有幾種幀緩沖(Framebuffer),Stencil buffer如何使用。看懂stencil.c文件。
幀緩存有幾種,什么叫片元,片元的測試和操作有哪些?
顏色緩存:包括左前,右前,左后,右后及任意數(shù)量的輔助顏色緩存。
深度緩存,模板緩存,累積緩存
?
明白stencilbuffer(模板緩沖區(qū))的使用。
模板測試常用的是屏蔽掉屏幕中一些不規(guī)則的區(qū)域,以免在這些區(qū)域中進(jìn)行繪圖。使用glStencilFunc()和glStencilOp()函數(shù)選擇需要使用的特定比較函數(shù),參考值以及對模板緩沖區(qū)所執(zhí)行的修改操作。
模板測試的結(jié)果決定了像素的顏色值是否要被寫入到渲染目標(biāo),像素的深度值是否要被寫入深度緩沖。
例如,當(dāng)參考模板值為0時(shí)將一些物體繪制到場景中,而此時(shí)模板緩沖已經(jīng)清除為1,那么當(dāng)繪制這些物體時(shí)模板緩沖就會為0。如果接著將參考值設(shè)置為1,而且StencilFunction設(shè)置為 CompareFunction.LessEqual,那么只有那些模板值不為0的對應(yīng)區(qū)域的像素會被繪制。這是使用模板緩沖創(chuàng)建一個限制當(dāng)前繪制區(qū)域的基本用法。
要使用模板緩沖,DepthFormat必須保留一些字節(jié)用于模板緩沖。
片元:
片元的測試按下列的順序進(jìn)行,如果在前面的測試中片元被刪除,則不在進(jìn)行后續(xù)的測試或操作。
1.?????? 剪取測試:利用glScissor()函數(shù)定義窗口中的一個矩形,并將圖限制在其中。
2.?????? alpha測試:利用alpha值來確定或是拒絕一個片元。利用glEnable()使用參數(shù)GL_ALPHA_TEST激活。喲哦那個glAlphaFunc()來比較。用來實(shí)現(xiàn)透明算法和紋理圖制作貼花。
3.?????? 模板測試:對存儲于模板緩存中的像素值與參考值進(jìn)行比較,根據(jù)比較的結(jié)果來對模板緩存中的值進(jìn)行修改。glStencilOp().
4.深度測試:用于消除隱藏表面的操作。glDepthFunc()來設(shè)置比較函數(shù)。?
13、請舉出一種場景反混淆(反走樣)的方法。
對場景的反走樣,通常采用多重采樣的方法。多重采樣的方法使用額外的顏色,深度和模版信息對圖元進(jìn)行反走樣處理。每個片元是根椐子像素樣本的數(shù)量和信息來計(jì)算,也就是根據(jù)一個多重采樣緩沖區(qū)所保存的樣本來計(jì)算。
一種是擾動視點(diǎn)的方法,也就是多次繪制這個場景,每次繪制時(shí),對視點(diǎn)進(jìn)行抖動,作一點(diǎn)輕微的偏移,當(dāng)整個渲染過程完結(jié)后,再把所有圖象疊加起來,由于每個圖象的位置不同,可以減輕鋸齒狀。
14、分析下面的程序并計(jì)算
?? 在下面的例子中,計(jì)算對應(yīng)1234四個頂點(diǎn)所對應(yīng)的四邊形上的一個點(diǎn)(-1.5, 0.5, 0.0)對應(yīng)的紋理坐標(biāo)是多少?按照最近鄰域?yàn)V波方法,該點(diǎn)對應(yīng)的顏色是什么?寫出詳細(xì)的計(jì)算過程,只有結(jié)果將不給分。
#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLuint texName;
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);
?? glGenTextures(1, &texName);
?? glBindTexture(GL_TEXTURE_2D, texName);
?? 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);
?? glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
??????????????? 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
}
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);
?? glBindTexture(GL_TEXTURE_2D, texName);
?? glBegin(GL_QUADS);
?? 1 glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
?? 2 glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
?? 3 glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
?? 4 glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
?? glEnd();
?? glFlush();
? }
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);
}
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);
?? glutMainLoop();?
}
?
?
總結(jié)
以上是生活随笔為你收集整理的OpenGL 期末考试作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构课程设计---------用栈来
- 下一篇: OpenGL 光照方程的计算