紋理(texture)
一個圖片從原始格式解碼並上傳到GPU就被稱為紋理。OpenGL要求紋理的高度和寬度都必須是2的n次方大小,只有滿足這個條件紋理圖片才是有效。 一旦擷取了像素值,我們就可以將這些資料傳給OpenGL,讓OpenGL產生一個紋理貼圖
為了繪製texture,常常使用幾何來描述,通過幾何對應的頂點來描述紋理。比如要描述一個矩形,可以通過矩形的四個頂點來描述。
要繪圖時,首先要綁定紋理,然後傳遞一個幾何描述(如矩形的四個頂點)給OpenGL進行繪製。而繪圖的大小和位置由幾何描述和OpenGL的viewport的設定共同決定。當然大部分的遊戲都會讓viewport的大小和螢幕一致,這就意味使用像素更容易讓紋理繪製在合適的大小和位置。
繪製一個矩形的幾何圖形是非常常見的,同樣讓同一個紋理在不同位置以不同大小位置也是非常常見的,比如漫天的彈幕。但是每次都傳遞每個形狀到GPU進行繪製的效率是較低的。所以許多相同紋理可以一起描述並一起送入GPU,這就是libgdx SpriteBatch類所要做的。
SpriteBatch被賦予了紋理和座標以便每個圖形的繪製,它彙集了很多圖形而沒有直接提交給GPU。如果它被賦予的紋理不同於原有的,它將保持原有的圖形,並擷取新的圖形。繪製的圖片,解析度必須是2的次方(如32x32, 128x128, 256x512, 512x1024等)
例如: 本樣本採用解析度為 256x256 像素:
圖形繪製
繪製圖形,程式啟動(create)——》讀取圖片(image)——》紋理(texture)綁定——》繪製初始化(sprite.begin)——》繪製(render)——》繪製完處理(sprite.end)——》銷毀(dispose)等步驟。
MainActivity
public class MainActivity extends AndroidApplication {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initialize(new MyGame(), false);}}
MyGame
public class MyGame implements ApplicationListener {private SpriteBatch batch;// 批量繪製private Texture texture;// 紋理@Overridepublic void create() {batch = new SpriteBatch();texture = new Texture(Gdx.files.internal("image03.png"));// 從asset檔案讀取圖片}@Overridepublic void resize(int arg0, int arg1) {}@Overridepublic void render() {Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);// 清屏Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);// 設定螢幕背景為灰色batch.begin();batch.draw(texture, 10, 10);batch.end();}@Overridepublic void pause() {}@Overridepublic void resume() {}@Overridepublic void dispose() {texture.dispose();batch.dispose();}}
MyGame程式碼片段中,image03.png 圖片需要儲存在 assets 檔案夾內,這是有libgdx檔案模組設計決定的
Gdx.files是libgdx的檔案模組,主要提供以下5大功能:
而擷取操作檔案的FileHandle有5種方法:
1) Classpath, 路徑相對於classpath,檔案通常為唯讀。注意: classpath與android的某些函數不相容,如 Audio.newSound(FileHandle) 和 Audio.newMusic(FileHandle)
2) Internal, 內部檔案路徑相對於desktop程式根目錄,或者android 的assets檔案夾。assets檔案夾本身就是儲存資源的檔案夾,相比res檔案夾,它其中的資源不會產生R中的ID,用來放圖片很是合適
3) External, 外部檔案路徑相對於desktop程式home目錄,或者android 的SD卡根目錄
4) Absolute, 絕對的檔案系統目錄,跨平台時需要注意對應的絕對路徑
5) Local, 本地目錄,對於android是應用Application自身內部的files目錄,對於desktop是root根目錄
因此,用Gdx.files.internal("image1.jpg")擷取的圖片,需要儲存在assets檔案夾下
讀取圖片後,調用batch.draw(texture,10,10) 繪製圖形,(10,10)是繪製座標,它基於笛卡爾座標,即以左下角為座標原點。
運行結果:
上面樣本說明:
首先,在create()申請texture,從內部assets檔案夾中讀取圖片 image03.png
texture = new Texture(Gdx.files.internal("image03.png"));
然後,在render() 中渲染繪製圖片
batch.draw(texture, 10, 10);// 繪製region
最後,在dispose中銷毀資源
texture.dispose();
batch.dispose();
參考推薦:
android遊戲開發架構libgdx 圖形繪製