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