歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 3D系列之紋理篇

Android 3D系列之紋理篇

日期:2017/3/1 11:18:07   编辑:Linux編程

之前的例子都是純色的3D模型。今天我們就開始給這些模型貼上華麗麗的紋理,讓他們看起來更加接近我們印象中的真實物體。

相關閱讀:

Android 3D 系列之光效篇 http://www.linuxidc.com/Linux/2011-09/43749.htm

Android 3D系列之入門實踐篇 http://www.linuxidc.com/Linux/2011-09/43751.htm

Android 3D 系列之紋理篇 http://www.linuxidc.com/Linux/2011-09/43753.htm

Android 3D系列之基本概念篇 http://www.linuxidc.com/Linux/2011-09/43752.htm

功能啟動

為使用紋理,我們需要打開OpenGL的一些開關以啟動我們需要的一些功能:

 gl.glEnable(GL10.GL_TEXTURE_2D);
。這個調用是必不可缺的;如果你沒有打開此功能,那麼你就無法將圖像映射到多邊形上。它可以在需要時打開和關閉,通常在初始化時打開。

創建紋理

生成紋理

OpenGL 中的紋理通過一個唯一號引用,通過函數 glBindTexture() 實現。你 可以自己指定這個唯一號,或者通過調用 glGenTextures () 函數生成一個唯一 號。

int[] tmp_tex = new int[1];//盡管只有一個紋理,但使用一個元素的數組
//glGenTextures(申請個數,存放數組,偏移值)
gl.glGenTextures(1, tmp_tex, 0); //向系統申請可用的,用於標示紋理的ID
int texture = tmp_tex[0];

紋理綁定

在為紋理生成名稱後,在為紋理提供圖像數據之前,我們必須綁定紋理。綁定使得指定紋理處於活動狀態。一次只能激活一個紋理。活動的或“被綁定”的紋理是繪制多邊形時使用的紋理,也是新紋理數據將加載其上紋理,所以在提供圖像數據前必須綁定紋理。

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

綁定紋理數據,傳入指定圖片
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);

紋理限制

用於紋理的圖像寬和高必須為乘方,比如 2, 4, 8, 16, 32, 64, 128, 256, 512, 或 1024。例如圖像可能為 64×128 或 512×512。

紋理坐標

當紋理映射啟動後繪圖時,你必須為OpenGL ES提供其他數據,即頂點數組中各頂點的 紋理坐標。紋理坐標定義了圖像的哪一部分將被映射到多邊形。它的工作方式有點奇怪。與我們頂點坐標方向不一致,假設你有一個正方形或長方形的紋理,其左下角為二維平面的原點,高和寬的單位為一。像這樣:

這就是我們的“紋理坐標系統”,不使用xy 來代表二維空間,我們使用 st 作為紋理坐標軸,但原理上是一樣的。

除了 st 軸外,被映射的紋理在多邊形同樣有兩個軸,它們稱為 uv軸。這是源於許多3D圖像程序中的UV 映射 的術語。

好,我們明白了紋理坐標系統,我們現在討論怎樣使用這些紋理坐標。當我們指定頂點數組中的頂點時,我們需要在另一個數組中提供紋理坐標,它稱為紋理坐標數組。 每個頂點,我們使用float 來指定頂點在上圖所示坐標系統的位置。讓我們看看一個可能是最為簡單的例子,將整個圖像映射到一個由三角形條組成的正方形上。首先,我們創建一個由四個頂點組成的頂點數組:

現在將兩個框圖疊在一起,所使用的坐標數組的值變得很明顯:

將其轉化為坐標數組:

 float texCoords[] = new float[]{ 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f };
Copyright © Linux教程網 All Rights Reserved