杜麗美
(長治學(xué)院 計算機系,山西 長治 046011)
紋理映射在物體重建中的應(yīng)用
杜麗美
(長治學(xué)院 計算機系,山西 長治 046011)
基于給定的三維物體模型,研究如何使用OpenGL中的紋理映射函數(shù),使得將紋理圖像完美地映射到三維物體表面,進而模擬出真實物體的面貌.此過程的核心問題是研究OpenGL中的紋理定義函數(shù),紋理控制函數(shù),紋理坐標函數(shù)等的使用.
紋理定義;紋理控制;紋理坐標
在當今的網(wǎng)絡(luò)時代下,大家可以借助計算機來滿足自己的各種需求,比如在工作、生活、科學(xué)研究上都要用到計算機,同樣計算機因其自身功能的強大,也可以為大家解決各種難題.
三維重建是目前研究的眾多熱點問題中的一個,比如,在工業(yè)生產(chǎn)中,可以先將設(shè)想中的某個部件在計算機上重建出來,然后對此虛擬部件進行各種參數(shù)的修改,最終得到該虛擬部件的各項參數(shù)的準確數(shù)據(jù),進而投入生產(chǎn).在醫(yī)學(xué)上三維重建技術(shù)也有相當重要的應(yīng)用.除此之外,大多數(shù)人對計算機視覺的要求越來越強烈,如何將現(xiàn)實生活中的物體形象地表現(xiàn)在計算機屏幕上,這是當下的熱門問題,此過程可以借助OpenGL函數(shù)中的光照、材質(zhì)、霧化等效果函數(shù)來渲染出真實的環(huán)境效果,但是真實物體表面的顏色往往是千變?nèi)f化非常復(fù)雜的,單用某些顏色函數(shù)往往是不夠的,基于這種情況,OpenGL函數(shù)中提供了紋理函數(shù),借助紋理函數(shù)就可以簡單、方便地在計算機屏幕上形象地模擬出真實的物體和真實的環(huán)境效果了[1,2].
紋理映射就是將現(xiàn)有的(或自己定義的)紋理圖像映射到指定的區(qū)域上,使該區(qū)域具有與紋理圖像一樣的外貌.通俗來說,就是將現(xiàn)有的一幅圖粘貼到預(yù)先構(gòu)造的三維物體表面上,進而來增強三維物體的真實感.
在紋理映射中,所使用的紋理圖像可以是自己定義的一副一維或二維圖像,也可以是現(xiàn)有的一副一維或二維圖像.在紋理圖像粘貼到三維物體表面上時,所采用的映射方式最簡單的是坐標對坐標的方式,但是在映射的實際過程中,由于三維物體表面可能是凹凸不平的,或者紋理圖像和三維物體表面的大小是不一樣的,因此在映射過程中就不能只是簡單的映射形式,而是必須根據(jù)實際需要將紋理圖進行適當?shù)睦臁嚎s等變換,這樣映射后的結(jié)果才具有真實感[3-5].下面將要介紹的紋理控制函數(shù)就可以解決此問題.
圖1中的兩幅圖就是進行紋理映射后最終的效果,1(a)中分別對地面和左右的墻面進行紋理映射,而且為了增強真實感,還用了光照和霧化函數(shù)來渲染效果.圖1(b).
為將自己定義的簡單的紋理圖像映射到曲面上的效果.由圖1中的兩種結(jié)果來看,紋理映射不僅適用于平面也可以應(yīng)用到曲面上.
圖1 紋理映射效果
進行紋理映射的一般過程是:首先最重要的是必須先定義一幅紋理圖像,然后選擇紋理控制函數(shù)說明映射方式,其次選擇映射方式(即紋理圖像上的顏色是否要和三維物體表面上的顏色進行混合),最后使用紋理坐標函數(shù)來完成映射.這幾個過程所對的函數(shù)的具體用法將在下文以下幾個小節(jié)中詳細介紹.
2.1 紋理函數(shù)
一般來說紋理有一維和二維之分,但是通常用到的是二維紋理,因此這里只介紹二維紋理所對的函數(shù)[6]:
glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width,
GLsizei height, Glint border, GLenum format, GLenum type, const GLvoid *pixels)
因為是二維紋理,所以此函數(shù)中的第一個參數(shù)取常數(shù)GL_TEXTURE_2D表明定義的二維紋理;第二個參數(shù)level表示紋理圖像的分辨率級數(shù),若只有一種分辨率則為0;第三個參數(shù)components的值一般取3,表示此紋理圖像是由R,G,B三個分量混合而成;第四和第五個參數(shù)width和height是定義此二維紋理圖像的大小(長和寬);如果此紋理圖像有邊界則由第六個參數(shù)border來定義,若沒有邊界,則此參數(shù)取0;第七個參數(shù)format一般取GL_RGB表示紋理映射的格式;第八個參數(shù)type通常取GL_UNSIGED_BYTE表示紋理映射的數(shù)據(jù)類型;第九個參數(shù)*pixels指向具體的紋理圖像數(shù)據(jù).
2.2 紋理控制函數(shù)
一張紋理圖像一般是規(guī)則的長方形或正方形區(qū)域,若將這張紋理圖像映射到一個凹凸不平的三維物體上時,可能此紋理圖像要隨著三維物體表面的凹凸形狀來變化,或者紋理圖像尺寸小于或大于三維物體表面的尺寸時,還要將紋理圖像進行拉伸或壓縮變換,這些情況就要借助本小節(jié)的紋理控制函數(shù)來實現(xiàn),所對函數(shù)如下[6]:
glTexParameteri(GLenum target, GLenum pname, TYPE param)
該函數(shù)中各參數(shù)的意義及取值為:第一個參數(shù)為常數(shù)GL_TEXTURE_1D或GL_TEXTURE_2D,后兩個參數(shù)的取值見表1所示.
表1 各參數(shù)的取值
參數(shù)GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER表示對紋理圖像進行放大和縮小變換,對應(yīng)的值GL_NEAREST和GL_LINEAR表示如何進行放大和縮小,其中GL_NEAREST表示紋理映射圖像以中心位置為支點來進行放大和縮小,GL_LINEAR表示使用線性插值的方法對紋理圖像進行放大和縮?。畢?shù)GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T表示紋理在X方向和Y方向上的延展,取值GL_CLAMP表示只延展紋理圖像的邊界像素值,GL_REPEAT表示重復(fù)延展整個紋理圖像.
2.3 映射方式
一般情況下,三維物體通過設(shè)置光照表面會有某種顏色,如果將一張紋理映射圖像直接映射到此三維物體上,要考慮的問題是紋理圖像上的顏色是否要和此物體表面上的顏色進行混合,此過程所涉及的函數(shù)為[6]:
glTexEnvf(GLenum target,GLenum pname,TYPE param)
此函數(shù)的第一個參數(shù)target的值取GL_TEXTURE_ENV,第二個參數(shù)pname一般取GL-TEXTURE-ENV-MODE,參數(shù)pname所對的第三個參數(shù)param一般取GL-DECAL、GL-MODULATE或GL-BLEND表明怎樣進行混合,GL-DECAL模式下所有的效果都將取消,物體表面只顯示紋理顏色;GL-MODULATE模式下會根據(jù)當前的紋理顏色來調(diào)整物體表面的光照和明暗;GL-BLEND模式是將紋理顏色與光照顏色混合.
2.4 紋理坐標函數(shù)
紋理坐標函數(shù)為[6]:
glTexCoord2f(GLfloats,GLfloat t)
該函數(shù)中第一個參數(shù)s表示X軸方向上的坐標,第二個參數(shù)t表示Y軸方向上的坐標,X、Y軸上的坐標(s,t)表示紋理圖像上的相應(yīng)位置,比如(0,0)表示紋理圖像上的左上點位置,(1,1)表示紋理圖像上的右下點位置,(0,1)表示紋理圖像上的左邊界的中間位置等等.當把紋理圖像粘貼到三維物體上時,要保證紋理圖像上的點正確地映射到三維物體的對應(yīng)位置上,如果映射錯誤,則會產(chǎn)生紋理圖像顛倒或變形的可能.一般在進行紋理映射時,紋理坐標和三維物體的對應(yīng)坐標要配對出現(xiàn).
2.5 其他一些函數(shù)
以上是進行紋理映射過程中必不可少的四個步驟,當然在進行紋理映射的過程中可能還要用到其他一些函數(shù),本小節(jié)再簡要地介紹兩個函數(shù).
glGenTexture(GLsizein,GLuint*textures)
該函數(shù)中的第一個參數(shù)n表示將要使用的紋理圖像的數(shù)量,第二個參數(shù)*textures表示指向這n個紋理圖像的指針,初始狀態(tài)下指向第一幅紋理圖像.通俗地說此函數(shù)表示生成n個紋理圖像并使用指針指向這n個紋理.
glBindTexture(GLenum target,GLuint texture)
該函數(shù)中的參數(shù)target同樣可以取GL_TEXTURE_1D或GL_TEXTURE_2D;參數(shù)texture表示選取特定的紋理,它的選取數(shù)量取決于函數(shù)glGenTexture中定義的紋理圖像的數(shù)量,通常函數(shù)glGenTexture與glBindTexture配合使用.
借助以上函數(shù),可以對不同的三維物體進行紋理映射,圖2中的(a)(b)為將自定義的紋理圖像映射到相應(yīng)物體上的結(jié)果,其中圖2(a)為將紋理圖像映射到二維空間中的矩形物體上的結(jié)果,圖2(b)為將同樣的紋理圖像映射到三維空間中的矩形物體上的結(jié)果;圖2(c)為將現(xiàn)有的一副紋理圖片分別映射到三維立方體的六個面上的結(jié)果.
圖2 紋理映射結(jié)果
本文主要介紹了OpenGL中的有關(guān)紋理函數(shù)的使用方法,其中紋理定義函數(shù)、紋理控制函數(shù)、紋理坐標函數(shù)是重點,它們決定著整個紋理映射工作的成敗,通過實驗結(jié)果分析發(fā)現(xiàn)紋理映射可以在計算機中完美地重現(xiàn)真實物體的面貌,而且操作簡單,容易上手,因此紋理映射過程是進行三維物體重建過程中的重要階段.
[1] 薛 安,馬靄乃,李天宏.基于OpenGL實現(xiàn)真實感地形表現(xiàn)的研究[J].中國圖像圖形學(xué)報,2001,6(8):800-805
[2] 范 波,吳慧中.多面體表面紋理映射方法的研究[J].計算機研究與發(fā)展,1999,36(04):446-450
[3] 郭 玲,王建宇等.真實感3D重建中的紋理映射技術(shù)[J].中國圖像圖形學(xué)報,2007,12(10):1881-1884
[4] 段曉娟.基于OpenGL的紋理映射技術(shù)[J].長沙大學(xué)學(xué)報,2000,14(4):40-41
[5] 禹仁貴,任 磊,王 寧.基于OpenGL的紋理映射的實現(xiàn)與應(yīng)用[J].西南民族大學(xué)學(xué)報(自然科學(xué)版),2008,34(6):1261-1263
[6] 廖朵朵.OpenGL變換、光照、紋理、動畫及特殊效果[J].微電腦世界,1996(11):151-153
The Applications in the Reconstruction of Texture Mapping
DU Limei
(Department of Computer Science Changzhi University, Changzhi 046011, China)
Given three-dimensional object model, Research on how to use the OpenGL texture mapping function, So that the texture image is mapped to the three-dimensional surface perfectly, And then simulate the appearance of real objects.The problem with this process is mainly research the Texture-defined functions, Texture-controlled functions, Texture-coordinated functions which are in the OpenGL.
texture-defined function;texture-controlled function;texture-coordinated function
2015-10-21 基金項目:長治學(xué)院校級科研課題(201419).
杜麗美(1983-),女,山西大同人,碩士,長治學(xué)院計算機系講師,主要從事計算機圖形學(xué)、圖像處理等研究.
1672-2027(2015)04-0054-04
TP391.41
A