二維紋理映射_第1頁
二維紋理映射_第2頁
二維紋理映射_第3頁
二維紋理映射_第4頁
二維紋理映射_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、二維紋理映射實驗目的和要求掌握紋理映射的基本原理,利用 VC+ OpenG吹現(xiàn)紋理映射技術。實驗原理紋理映射是真實感圖形制作的一個重要部分,運用紋理映射可以方面地制作真實感圖形,而不必花更多的時間去考慮物體的表面紋理。如一張木制桌子其表面的木紋是不規(guī)范的,看上去又是那么自然, 如果在圖形制作中不用紋理映射,那么只是這張桌面紋理的設計,就要花費很大精力,而且設計結果也未必能像現(xiàn)實中那么自然。如果運用紋理映射就非常方便,可以用掃描儀將這樣的一張桌子掃成一個位圖。然后的具體的操作中,只需把桌面形狀用多邊形畫出來,把桌面紋理貼上去就可以了。另外,紋理映射能夠在多邊形進行變換時仍保證紋理的圖案與多邊形保

2、持一致性。例如,以透視投影方式觀察墻面時,遠端的磚會變小,而近處的磚就會大一些。此外,紋理映射也可以用于其他方面。例如,使用一大片植被的圖像映射到一些連續(xù)的多邊形上,以模擬地貌,或者以大理石、木紋等自然物質的圖像作為紋理映射到相應的多邊形上,作為物體的真實表面。在OpenG沖提供了一系列完整的紋理操作函數(shù),用戶可以用它們構造理想的物體表面,可以對光照物體進行處理,使其映射出所處環(huán)境的景象,可以用不同方式應用到曲面上,而且可以隨幾何物體的幾何屬性變換而變化,從而使制作的三維場景和三維物體更真實更自然。在OpenG沖要實現(xiàn)紋理映射,需要經歷創(chuàng)建紋理、指定紋理應用方式、啟用紋理映射、使用紋理坐標和幾

3、何坐標繪制場景幾個過程。用于指定一維、二維和三維紋理的函數(shù)分別為:Void glTexImage1D(GLenum target, Glint level, Glint components, GLsizei width, Glint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLint border, GLenum format,

4、GLenum type, const GLvoid *texels);Void glTexImage3D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLsizei depth, Glint border, GLenum format, GLenum type, const GLvoid *texels);其中,參數(shù) target 取值一般為 GL_TEXTURE_1D, GL_TEXTURE_2BSL_TEXTURE_3D分別與一維、二維和三維的紋理相對應。參數(shù) Level表示紋理多

5、分辨率層數(shù),通常取值為0,表示只有一種分辨率。參數(shù)components的可能取值為14的整數(shù)以及多種符號常量 (如GL_RGBA)表示紋理元素中存儲的哪些分量(RGB顏色、深度等)在紋理映射中被使用,1表示使用 赫色分量,2表示使用M口A顏色分量,3表示使用RG顏色分量,4表示使用RGBAM色分量。參數(shù)width , height , depth分別指定紋理的寬度、高度、深 度。參數(shù)format和type表示給出的圖像數(shù)據(jù)的數(shù)據(jù)格式和數(shù)據(jù)類型,這兩個參數(shù)的取值都是符號常量(比如format指定為GL_RGBA,typ&f定為GL_UNSIGNED_BYT以數(shù)texels指向內存中指定的

6、紋理圖像數(shù)據(jù)。在定義了紋理之后,需要啟用紋理的函數(shù):glEnable(GL_TEXTURE_1D); glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_3D);在啟用紋理之后,需要建立物體表面上點與紋理空間的對應關系,即在繪制基本圖元時,在glVertex函數(shù)調用之前調用glTexCoord函數(shù),明確指定當前頂點所對應的紋理坐標,例如:glBegin (GL_TRIANGLES ;glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);glTexCoord2f(1.0, 1.0); glVertex2f(15.0, 15.

7、0);glTexCoord2f(1.0, 0.0); glVertex2f(30.0, 0.0);glEnd();其圖元內部點的紋理坐標利用頂點處的紋理坐標采用線性插值的方法計算出來。在OpenG沖,紋理坐標的范圍被指定在0,1之間,而在使用映射函數(shù)進行紋理坐標計算時,有可能得到不在0,1之間的坐標。此時 OpenGLt兩種處理方式,一種是截斷,另一種是重復,它們被稱為環(huán)繞模式。在截斷模式(GL_CLAMP中,將大于1.0的紋理坐標設置為1.0,將小于0.0的紋理坐標設置 為0.0。在重復模式(GL_REPEAT中,如果紋理坐標不在0,1之間,則將紋理坐標值的整數(shù)部分舍棄, 只使用小數(shù)部分,這

8、樣使紋理圖像在物體表面重復出現(xiàn)。例如,使用下面的函數(shù):glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);分別指定二維紋理中s坐標采用截斷或重復處理方式。另外,在變換和紋理映射后,屏幕上的一個像素可能對應紋理元素的一小部分(放大),也可能對應大量的處理元素(縮小)。在OpenG仲,允許指定多種方式來決定如何完成像素與紋理元素對應的計 算方法(濾波)。比如,下面的函數(shù)可以指定放大和縮小的濾波方法:glTexP

9、arameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);其中,glTexParameteri函數(shù)的第一個參數(shù)指定使用的是一維、二維或三維紋理;第二個參數(shù)為GL_TEXTURE_MAG_FILTEGL_TEXTURE_MIN_FILTE R旨出要指定縮小還是放大濾波算法;最后一個參數(shù)指定濾波的方法。補充:透視投影函數(shù)void gluPerspective(GLdouble fovy, GLdouble

10、aspect, GLdouble zNear, GLdouble zFar);它也創(chuàng)建一個對稱透視視景體,但它的參數(shù)定義于前面的不同。其操作是創(chuàng)建一個對稱的透視投影矩陣,并且用這個矩陣乘以當前矩陣。參數(shù)fovy定義視野在X-Z平面的角度,范圍是0.0,180.0;參數(shù)aspect是投影平面寬度與高度的比率;參數(shù)zNear和Far分別是遠近裁剪面沿 Z負軸到視點的距離,它們總為正值。三、實驗內容在OpenGL中紋理映射所使用的紋理數(shù)據(jù),既可以是程序生成的一組數(shù)據(jù),也可以從 外部文件中直接讀取,參考示范代碼完成以下兩項內容:源碼(/ cgtest.cpp : Defines the entry p

11、oint for the console application./ test.cpp :定義控制臺應用程序的入口點/#include <stdio.h>#include "glut.h"#include <math.h>#include <Windows.h>這是一個點的類,用于存儲其中點的坐標class Pointpublic:int x, y;void setxy(int _x, int _y) x = _x;y = _y;);/點的數(shù)量static int POINTSNUM = 0;用于存儲點的集合,因為繪制的都是4個點的貝塞爾

12、曲線,所以數(shù)組大小為static Point points4;初始化函數(shù)void init(void)glClearColor(1.0, 1.0, 1.0, 0); /校定背景為黑色glColor3f(0.0, 0.0, 0.0); 繪圖顏色為白色glPointSize(2.0); /股定點的大小為2*2像素的glMatrixMode(GL_PROJECTION); /校定合適的矩陣glLoadIdentity(); /是一個無參的無信函數(shù),其功能是用一個4X4的單位矩陣來替 換當前矩陣,實際上就是對當前矩陣進行初始化。也就是說,無論以前進行了多少次矩陣 變換,在該命令執(zhí)行后,當前矩陣均恢復成

13、一個單位矩陣,即相當于沒有進行任何矩陣變 換狀態(tài)gluOrtho2D(0.0, 600.0, 0.0, 480.0); /平行投影,四個參數(shù)分別是 x,y范圍/繪制點void setPoint(Point p) glBegin(GL_POINTS);glVertex2f(p.x, p.y);glEnd();glFlush();/繪制直線void setline(Point p1, Point p2) glBegin(GL_LINES);glVertex2f(p1.x, p1.y);glVertex2f(p2.x, p2.y);glEnd();glFlush();/繪制貝塞爾曲線Point se

14、tBezier(Point p1, Point p2, Point p3, Point p4, double t) Point p;double a1 = pow(1 - t), 3);double a2 = pow(1 - t), 2) * 3 * t;double a3 = 3 * t*t*(1 - t);double a4 = t*t*t;p.x = a1*p1.x + a2*p2.x + a3*p3.x + a4*p4.x;p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;return p;)/display 函數(shù)void display()glC

15、lear(GL_COLOR_BUFFER_BIT);glFlush();)/鼠標事件void mymouseFunction(int button, int state, int x, int y) if (state = GLUT_DOWN) 如果鼠標按下,不區(qū)分左右鍵的pointsPOINTSNUM.setxy(x, 480 - y); 這里求鼠標點的坐標的時候/設置點的顏色,繪制點glColor3f(1.0, 0.0, 0.0);setPoint(pointsPOINTSNUM);/設置線的顏色,繪制線glColor3f(1.0, 0.0, 0.0);if (POINTSNUM >

16、 0) setline(pointsPOINTSNUM - 1, pointsPOINTSNUM);如果達到了 4個繪制貝塞爾曲線,并在之后給計數(shù)器清零 if (POINTSNUM = 3) 繪制貝塞爾曲線glColor3f(0.0, 0.0, 1.0); /設定貝塞爾曲線的顏色Point p_current = points0; / 設為起點 for (double t = 0.0; t <= 1.0; t += 0.05) Point P = setBezier(points0, points1, points2, points3, t); setline(p_current, P);p_current = P;POINTSNUM = 0;else POINTSNUM+;int main(int argc, char *argv)glutInit(&argc, argv); / 固定格式glutInitDisplayMode(GLUT_RGB | GLUT_SING

溫馨提示

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

評論

0/150

提交評論