圖形學實驗報告書_第1頁
圖形學實驗報告書_第2頁
圖形學實驗報告書_第3頁
圖形學實驗報告書_第4頁
圖形學實驗報告書_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

STYLEREF"標題2"錯誤!文檔中沒有指定樣式的文字。SUBJECT錯誤!未指定書簽。數(shù)字圖像處理實驗指導書實驗五紋理映射實驗一、實驗目的和要求掌握紋理映射的基本原理,利用VC++OpenGL實現(xiàn)紋理映射技術(shù)。實驗原理紋理映射是真實感圖形制作的一個重要部分,運用紋理映射可以方面地制作真實感圖形,而不必花更多的時間去考慮物體的表面紋理。如一張木制桌子其表面的木紋是不規(guī)范的,看上去又是那么自然,如果在圖形制作中不用紋理映射,那么只是這張桌面紋理的設(shè)計,就要花費很大精力,而且設(shè)計結(jié)果也未必能像現(xiàn)實中那么自然。如果運用紋理映射就非常方便,可以用掃描儀將這樣的一張桌子掃成一個位圖。然后的具體的操作中,只需把桌面形狀用多邊形畫出來,把桌面紋理貼上去就可以了。另外,紋理映射能夠在多邊形進行變換時仍保證紋理的圖案與多邊形保持一致性。例如,以透視投影方式觀察墻面時,遠端的磚會變小,而近處的磚就會大一些。此外,紋理映射也可以用于其他方面。例如,使用一大片植被的圖像映射到一些連續(xù)的多邊形上,以模擬地貌,或者以大理石、木紋等自然物質(zhì)的圖像作為紋理映射到相應(yīng)的多邊形上,作為物體的真實表面。在OpenGL中提供了一系列完整的紋理操作函數(shù),用戶可以用它們構(gòu)造理想的物體表面,可以對光照物體進行處理,使其映射出所處環(huán)境的景象,可以用不同方式應(yīng)用到曲面上,而且可以隨幾何物體的幾何屬性變換而變化,從而使制作的三維場景和三維物體更真實更自然。在OpenGL中要實現(xiàn)紋理映射,需要經(jīng)歷創(chuàng)建紋理、指定紋理應(yīng)用方式、啟用紋理映射、使用紋理坐標和幾何坐標繪制場景幾個過程。用于指定一維、二維和三維紋理的函數(shù)分別為:VoidglTexImage1D(GLenumtarget,Glintlevel,Glintcomponents,GLsizeiwidth,Glintborder,GLenumformat,GLenumtype,constGLvoid*texels);VoidglTexImage2D(GLenumtarget,Glintlevel,Glintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*texels);VoidglTexImage3D(GLenumtarget,Glintlevel,Glintcomponents,GLsizeiwidth,GLsizeiheight,GLsizeidepth,Glintborder,GLenumformat,GLenumtype,constGLvoid*texels);其中,參數(shù)target取值一般為GL_TEXTURE_1D,GL_TEXTURE_2D和GL_TEXTURE_3D,分別與一維、二維和三維的紋理相對應(yīng)。參數(shù)Level表示紋理多分辨率層數(shù),通常取值為0,表示只有一種分辨率。參數(shù)components的可能取值為1~4的整數(shù)以及多種符號常量(如GL_RGBA),表示紋理元素中存儲的哪些分量(RGBA顏色、深度等)在紋理映射中被使用,1表示使用R顏色分量,2表示使用R和A顏色分量,3表示使用RGB顏色分量,4表示使用RGBA顏色分量。參數(shù)width,height,depth分別指定紋理的寬度、高度、深度。參數(shù)format和type表示給出的圖像數(shù)據(jù)的數(shù)據(jù)格式和數(shù)據(jù)類型,這兩個參數(shù)的取值都是符號常量(比如format指定為GL_RGBA,type指定為GL_UNSIGNED_BYTE,參數(shù)texels指向內(nèi)存中指定的紋理圖像數(shù)據(jù)。在定義了紋理之后,需要啟用紋理的函數(shù):整個過程需要三個步驟:創(chuàng)建紋理、啟用紋理映射和使用紋理坐標和幾何坐標繪制,下面我們對三個過程進行闡述,并給出參考代碼。1)創(chuàng)建紋理對象并綁定紋理 紋理創(chuàng)建即在內(nèi)存中創(chuàng)建保存紋理數(shù)據(jù)的數(shù)組,一般是先讀入一個圖像文件,將圖像文件的RGBA信息存入我們創(chuàng)建的紋理空間中,當然圖像的位圖不同,創(chuàng)建的紋理空間結(jié)構(gòu)也會有所不同。為了更加簡單易懂地實現(xiàn)這個過程,我們使用未壓縮的紋理。代碼:GLuinttexture[1];//創(chuàng)建一個紋理空間AUX_RGBImageRec*LoadBMP(CHAR*Filename)//載入位圖圖像{ FILE*File=NULL;//文件句柄 if(!Filename)//確保文件名已提供 { returnNULL; } File=fopen(Filename,"r");//嘗試打開文件 if(File) { fclose(File);//關(guān)閉文件 returnauxDIBImageLoadA(Filename);//載入位圖并返回指針 } returnNULL;}//如果載入失敗,返回NULLintLoadGLTextures()//載入位圖并轉(zhuǎn)換成紋理{ intStatus=FALSE;//狀態(tài)指示器 AUX_RGBImageRec*TextureImage[1];//創(chuàng)建紋理的存儲空間 memset(TextureImage,0,sizeof(void*)*1);//初始化//載入位圖,檢查有無錯誤,如果位圖沒找到則退出 if(TextureImage[0]=LoadBMP("data.bmp")) { Status=TRUE; glGenTextures(1,&texture[0]);//創(chuàng)建紋理//使用來自位圖數(shù)據(jù)生成的典型紋理 glBindTexture(GL_TEXTURE_2D,texture[0]);//生成2D紋理 glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if(TextureImage[0])//紋理是否存在 { if(TextureImage[0]->data)//紋理圖像是否存在 { free(TextureImage[0]->data);//釋放紋理圖像占用的內(nèi)存 } free(TextureImage[0]);//釋放圖像結(jié)構(gòu) } returnStatus;//返回Status}2)啟用紋理映射操作,初始化相關(guān)參數(shù) 在OpenGL中使用紋理映射之前,必須打開紋理映射。intInitGL(GLvoid){ if(!LoadGLTextures())//調(diào)用紋理載入子例程 { returnFALSE; } glEnable(GL_TEXTURE_2D);//啟用紋理映射 glShadeModel(GL_SMOOTH);//啟用陰影平滑 glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景 glClearDepth(1.0f);//設(shè)置深度緩存 glEnable(GL_DEPTH_TEST);//啟用深度測試 returnTRUE;}3)使用紋理坐標和幾何坐標繪制voidDrawGLScene(void){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(zrot,0.0f,0.0f,1.0f);//選擇紋理 glBindTexture(GL_TEXTURE_2D,texture[0]);//繪制一個正方體,給每個面貼上紋理,并使之轉(zhuǎn)動 glBegin(GL_QUADS); …… glEnd();xrot+=0.3f;yrot+=0.2f;zrot+=0.4f;}實驗代碼1、利用直接創(chuàng)建紋理的方法生成二維紋理并映射到四邊形上。#include<stdlib.h>#include<GL/glut.h>#defineimageWidth64#defineimageHeight64GLubyteimage[imageWidth][imageHeight][3];/*繪制一個簡單的二維紋理圖*/voidmakeImage(void){inti,j,r,g,b;/*根據(jù)點的位置設(shè)置不同的顏色*/for(i=0;i<imageWidth;i++){for(j=0;j<imageHeight;j++){r=(i*j)%255;g=(i*i)%255;b=(j*j)%255;image[i][j][0]=(GLubyte)r;image[i][j][1]=(GLubyte)g;image[i][j][2]=(GLubyte)b;}}}voidmyInit(void){glClearColor(0.0,0.0,0.0,0.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);//生成紋理數(shù)據(jù)makeImage();//設(shè)置像素存儲模式glPixelStorei(GL_UNPACK_ALIGNMENT,1);/*指定二維紋理映射*/glTexImage2D(GL_TEXTURE_2D,0,3,imageWidth,imageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&image[0][0][0]);//紋理過濾函數(shù)/*GL_TEXTURE_2D:操作D紋理.GL_TEXTURE_WRAP_S:S方向上的貼圖模式.GL_CLAMP:將紋理坐標限制在.0,1.0的范圍之內(nèi).如果超出了會如何呢.不會錯誤,只是會邊緣拉伸填充.GL_TEXTURE_MAG_FILTER:放大過濾GL_LINEAR:線性過濾,使用距離當前渲染像素中心最近的個紋素加權(quán)平均值.GL_TEXTURE_MIN_FILTER:縮小過濾GL_LINEAR_MIPMAP_NEAREST:使用GL_NEAREST對最接近當前多邊形的解析度的兩個層級貼圖進行采樣,然后用這兩個值進行線性插值.*/glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/*設(shè)置紋理環(huán)境參數(shù)*///glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);//啟用二維紋理glEnable(GL_TEXTURE_2D);glShadeModel(GL_FLAT);}voidmyDisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*將紋理映射到四邊形上*/glBegin(GL_QUADS);/*紋理的坐標和四邊形頂點的對應(yīng)*/glTexCoord2f(0.0,0.0);glVertex3f(-0.7,-0.25,0.0);glTexCoord2f(0.0,1.0);glVertex3f(-0.2,-0.25,0.0);glTexCoord2f(1.0,1.0);glVertex3f(-0.2,0.25,0.0);glTexCoord2f(1.0,0.0);glVertex3f(-0.7,0.25,0.0);glTexCoord2f(0.0,0.0);glVertex3f(0.2,-0.25,1.875);glTexCoord2f(0.0,1.0);glVertex3f(0.6,-0.25,0.0);glTexCoord2f(1.0,1.0);glVertex3f(0.6,0.25,0.125);glTexCoord2f(1.0,0.0);glVertex3f(0.2,0.25,2.0);glEnd();glFlush();}voidmyReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(80.0,1.0-(GLfloat)w/(GLfloat)h,1.0,30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}intmain(intargc,char**argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);glutCreateWindow("Texture");//創(chuàng)建窗口myInit();//繪制與顯示glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return0;}2、從外部文件中直接讀取紋理實現(xiàn)正方體每個面的紋理映射,并使正方體轉(zhuǎn)動。#include<GL/glut.h>#include<GL/glaux.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>#pragmacomment(lib,"openGL32.lib")#pragmacomment(lib,"glu32.lib")#pragmacomment(lib,"glaux.lib")#pragmacomment(lib,"openGL32.lib")GLuinttexture[1];//創(chuàng)建紋理空間GLfloatxRot,yRot,zRot;//控制正方體的旋轉(zhuǎn)//載入位圖圖像AUX_RGBImageRec*LoadBMP(CHAR*Filename){//載入位圖圖像 FILE*File=NULL;//文件句柄 if(!Filename){//確保文件名已提供 returnNULL; } File=fopen(Filename,"r");//嘗試打開文件 if(File){ fclose(File);//關(guān)閉文件 returnauxDIBImageLoadA(Filename);//載入位圖并返回指針 } returnNULL;//如果載入失敗,返回NULL}intLoadGLTextures(){//載入位圖并轉(zhuǎn)換成紋理 intStatus=FALSE;//狀態(tài)指示器 AUX_RGBImageRec*TextureImage[1];//創(chuàng)建紋理的存儲空間 memset(TextureImage,0,sizeof(void*)*1);//初始化//載入位圖,檢查有無錯誤,如果位圖沒找到則退出 if(TextureImage[0]=LoadBMP("data.bmp")){ Status=TRUE; glGenTextures(1,&texture[0]);//創(chuàng)建紋理//使用來自位圖數(shù)據(jù)生成的典型紋理 glBindTexture(GL_TEXTURE_2D,texture[0]);//生成D紋理 glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if(TextureImage[0]){//紋理是否存在 if(TextureImage[0]->data){//紋理圖像是否存在 free(TextureImage[0]->data);//釋放紋理圖像占用的內(nèi)存 } free(TextureImage[0]);//釋放圖像結(jié)構(gòu) } returnStatus;//返回Status}intInitGL(GLvoid){ if(!LoadGLTextures()){//調(diào)用紋理載入子例程 returnFALSE; } glEnable(GL_TEXTURE_2D);//啟用紋理映射 glShadeModel(GL_SMOOTH);//啟用陰影平滑 glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景 glClearDepth(1.0f);//設(shè)置深度緩存 glEnable(GL_DEPTH_TEST);//啟用深度測試 returnTRUE;}voiddisplay(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0f,0.0f,-5.0f);glRotatef(xRot,1.0f,0.0f,0.0f);glRotatef(yRot,0.0f,1.0f,0.0f);glRotatef(zRot,0.0f,0.0f,1.0f); //繪制正方體,貼上紋理并使之轉(zhuǎn)動glBindTexture(GL_TEXTURE_2D,texture[0]);//選擇紋理glBegin(GL_QUADS);//前glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//后glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//上glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//下glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//右glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glEnd();glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//左glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glEnd();glutPostRedisplay();glut

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論