胡顧飛 湯文兵 朱成亮
(安徽理工大學計算機科學與工程學院,安徽 淮南 232001)
紋理映射的本質是對三維物體進行二維參數化,即先求得三維物體表而上任一點的二維(u,v)參數值,進而得到該點的紋理值,最終生成三維圖形表而上的紋理圖案。在光滑曲而上添加紋理圖案的核心問題是映射,因此紋理問題可以簡化為從一個坐標系到另一個坐標系的變換。總的來說,紋理映射技術是一種使建立的3D模型更接近現實物體的技術。
紋理生成過程實質上是將所定義的紋理映射為反映某種三維景物表面的屬性(與光照明模型及表面幾何有關的各種參數,如表面法向、漫/鏡面反射率等),并參與后續的光照明計算。
二維紋理映射就是從二維紋理平面到三維物體表面的映射。一般二維紋理平面是有范圍限制的,在這個平面區域內,每點都可用數學函數表達,從而可以離散的分離出每點的灰度值和顏色值,這個平面區域稱為紋理空間,一般將紋理空間的平面區域定義在[0,1]*[0,1]。紋理映射是確定物體表面一點P在紋理空間中的對應點(u,v),從而紋理空間中的點(u,v)處的紋理值就是物體表面點P的紋理屬性。建立紋理空間與景物空間及景物空間與屏幕空間之間的映射關系:


圖1 紋理映射
景物表面的紋理屬性主要有以下幾種:表面顏色,即表面的漫反射率;鏡面反射分量,即表面的鏡面反射率;透明度;表面法向,即撓動表面法向來產生表面的凹凸紋理;環境的漫反射和鏡面反射效果;光源強度和色彩分布。
根據紋理定義域的不同,可分為而為二維和三維紋理,由于本文是基于Android平臺的,考慮到效率和資源問題,主要給出了二維紋理的模型,對三維紋理映射技術就不再討論了。
本節將通過在一個立方體各個面貼上圖片來介紹Android平臺下基于OpenGL ES的紋理映射有關的內容:定義紋理、控制濾波、說明映射方式、繪制場景,給出頂點的紋理坐標和幾何坐標。
首先,我們通過Android平臺的OpenGL ES庫來創建一個紋理,并使用圖片來生成一個紋理,過程如下:

通過以上過程,我們便成功地創建了一個紋理。
為了能有更好的效果,我們還需要設置在OpenGL現實圖像時,它放大得比原始紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始紋理小(GL_TEXTURE_MIN_FILTER)時OpenGL所采用的濾波方式。以下過程是我們設置的線性濾波://設置線性濾波

與之對應的,關閉紋理過程如下:

為了將紋理正確的映射到四邊形上,必須將紋理的右上角映射到四邊形的右上角,紋理的左上角映射到四邊形的左上角,紋理的右下角和左下角亦是如此。因為,如果映射錯誤的話,圖像顯示時可能上下顛倒,側向一邊或者什么都沒有。下面是我們對立方體的每一個面所設置的紋理映射數據:

設置好這些映射數據之后,可以通過glTex-CoordPointer將紋理綁定到要繪制的物體上。過程如下:

最后,將其繪制到屏幕上即可。效果圖2如圖所示:

圖2 紋理映射效果
本文通過對紋理映射的基本原理進行了分析,并在Android平臺中利用Opengl ES圖形庫對紋理映射技術進行了實現。
由于本文利用的是Android應用層封裝后的Opengl ES圖形庫,在效率上欠佳,以后的主要工作是通過Android NDK對Opengl ES進行原生態開發,進而提高實現效率。
[1]李增忠.紋理映射技術的研究[D].中國優秀碩士學位論文全文數據庫,2005.
[2](美)Shane Conder.Android 移動應用開發從入門到精通[M].北京:人民郵電出版社,2010.
[3]楊豐盛.Android應用開發揭秘[M].北京:機械工業出版社,2010.