基於Android平臺的紋理映射分析與實現論文
引言
紋理映射的本質是對三維物體進行二維參數化,即先求得三維物體表而上任一點的二維(u,v)參數值,進而得到該點的紋理值,最終生成三維圖形表而上的紋理圖案。在光滑曲而上添加紋理圖案的核心問題是映射,因此紋理問題可以簡化爲從一個座標系到另一個座標系的變換。總的來說,紋理映射技術是一種使建立的3D模型更接近現實物體的技術。
1紋理映射基本原理
紋理生成過程實質上是將所定義的紋理映射爲反映某種三維景物表面的屬性(與光照明模型及表面幾何有關的各種參數,如表面法向、漫/鏡面反射率等),並參與後續的光照明計算。
二維紋理映射就是從二維紋理平面到三維物體表面的映射。一般二維紋理平面是有範圍限制的,在這個平面區域內,每點都可用數學函數表達,從而可以離散的分離出每點的灰度值和顏色值,這個平面區域稱爲紋理空間,一般將紋理空間的平面區域定義在[0,1]*[0,1]。紋理映射是確定物體表面一點P在紋理空間中的對應點(u,v),從而紋理空間中的點(u,v)處的紋理值就是物體表麪點P的紋理屬性。建立紋理空間與景物空間及景物空間與屏幕空間之間的映射關係:
圖1紋理映射
景物表面的紋理屬性主要有以下幾種:
表面顏色,即表面的漫反射率;鏡面反射分量,即表面的鏡面反射率;透明度;表面法向,即撓動表面法向來產生表面的凹凸紋理;環境的漫反射和鏡面反射效果;光源強度和色彩分佈。
根據紋理定義域的不同,可分爲而爲二維和三維紋理,由於本文是基於Android平臺的,考慮到效率和資源問題,主要給出了二維紋理的模型,對三維紋理映射技術就不再討論了。
2紋理映射的實現
本節將透過在一個立方體各個面貼上圖片來介紹Android平臺下基於OpenGLES的.紋理映射有關的內容:定義紋理、控制濾波、說明映射方式、繪製場景,給出頂點的紋理座標和幾何座標。
首先,我們透過Android平臺的OpenGLES庫來創建一個紋理,並使用圖片來生成一個紋理,過程如下:
IntBufferintBuffer=cate(1);//創建紋理
nTextures(1,intBuffer);//設定要使用的紋理
ndTexture(_TEXTURE_2D,texture);
函數glGenTextures(intn,intBuffertextures)用於通知OpenGL我們想生成一個紋理的名字。函數glBindTexture(inttarget,inttexture)方法用於通知OpenGL將紋理名字texture綁定到紋理目標上。
在Android中我們使用GLUtils中的一個靜態方法texImage2D(inttarget,intlevel,Bitmapbitmap,intborder)來生成一個紋理。過程如下:
//生成紋理
mage2D(_TEXTURE_2D,0,map,0)
透過以上過程,我們便成功地創建了一個紋理。
爲了能有更好的效果,我們還需要設定在OpenGL現實圖像時,它放大得比原始紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始紋理小(GL_TEXTURE_MIN_FILTER)時OpenGL所採用的濾波方式。以下過程是我們設定的線性濾波://設定線性濾波
xParameterx(_TEXTURE_2D,_TEXTURE_MIN_FILTER,_LINEAR);
在android中可以使用glBindTexture(inttarget,inttexture)方法來綁定紋理。以下過程綁定了上面創建的紋理:ndTexture(_TEXTURE_COORD_ARRAY);//綁定紋理
紋理需要使用glEnableClientState()方法來開啓紋理:ableClientState(_TEXTURE_COORD_ARRAY);
與之對應的,關閉紋理過程如下:
sableClientState(_TEXTURE_COORD_ARRAY);
爲了將紋理正確的映射到四邊形上,必須將紋理的右上角映射到四邊形的右上角,紋理的左上角映射到四邊形的左上角,紋理的右下角和左下角亦是如此。因爲,如果映射錯誤的話,圖像顯示時可能上下顛倒,側向一邊或者什麼都沒有。下面是我們對立方體的每一個面所設定的紋理映射數據:
IntBuffertexCoords=(newint[]
{
One,0.,0,0,0,one,one,one,
0,0,0,one,one,one,one,0,
One,one,one,0,0,0,0,one
0,one,one,one,one,0,0,0,
0,0,0,one,one,one,one,0,
One,0,0,0,0,one,one,one
});
設定好這些映射數據之後,可以透過glTexCoordPointer將紋理綁定到要繪製的物體上。過程如下:
xtCoordPointer(2,_FIXED,0,texCoords);
最後,將其繪製到屏幕上即可。效果圖2如圖所示:
圖2紋理映射效果
3結束語
本文透過對紋理映射的基本原理進行了分析,並在Android平臺中利用OpenglES圖形庫對紋理映射技術進行了實現。
由於本文利用的是Android應用層封裝後的OpenglES圖形庫,在效率上欠佳,以後的主要工作是透過AndroidNDK對OpenglES進行原生態開發,進而提高實現效率。
參考文獻
[1]李增忠.紋理映射技術的研究[D].中國優秀碩士學位論文全文數據庫,2005.
[2](美)der.Android移動應用開發從入門到精通[M].北京:人民郵電出版社,2010.
[3]楊豐盛oid應用開發揭祕[M].北京:機械工業出版社,2010.
-
淺談20世紀初歐洲油畫作品的運動感論文
【摘要】繪畫的魅力在於靈氣,而靈氣在於運動感。油畫中所包含的運動感尤爲重要,是油畫的靈氣,是其藝術價值的魅力所在。油畫作品中的運動感,有的用線條、筆觸、光線、力度、角和麪表現,有的透過物象本身呈現,而有的是包含在繪畫作品之中,需要仔細欣賞滿慢慢品位的。本...
-
有關合理定價評審抽取的研究論文
1“合理定價評審抽取法”的主要優點根據《中華人民共和國招標投標法》規定,招標投標必須遵循“公開、公平、公正、誠實信用”的原則。不可否認,該評標辦法對維護建設工程招標投標的原則起了一定的積極作用。最大程度地體現了“公開”原則。在指定的媒介公佈招...
-
畢業論文承諾書【薦】
在各領域中,大家都寫過論文吧,透過論文寫作可以培養我們獨立思考和創新的能力。爲了讓您在寫論文時更加簡單方便,下面是小編爲大家整理的畢業論文承諾書,希望能夠幫助到大家。畢業論文承諾書1本人向學院畢業論文指導工作小組承諾以下內容:1.我將如實標註本論文所引...
-
實用的小論文作文合集6篇
在各領域中,大家都嘗試過寫論文吧,論文是討論某種問題或研究某種問題的文章。一篇什麼樣的論文才能稱爲優秀論文呢?以下是小編幫大家整理的小論文作文6篇,僅供參考,大家一起來看看吧。小論文作文篇1在我們的生活中,處處少不了用電,所以電池以方便、小巧開始流行起來。...