2011-05-12 18 views
1

我正嘗試在Android上使用OpenGL進行2D編程。現在,我正處於準備階段。試圖配置我的視口。我有紋理加載和繪圖,但我無法讓它們像我想要的那樣繪製。如果可能的話,我希望原點位於屏幕的左上角,向下增加,因爲這是我的代碼(從以前使用畫布時繼承)的設置。我認爲這很容易;沿翻譯和翻轉的方向。當我嘗試修改配置視口的語句時,我很驚訝地發現,顯然我的應用程序甚至不受它們的影響。見下面的代碼爲GLRenderer的onSurfaceChanged()方法:在Android上設置用於2D OpenGL編程的視口

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    this.width = width; 
    this.height = height; 

    gl.glViewport(0, 0, width, height); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0, width, height, 0); 
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 
} 

我可以完全改變這些值,或者甚至評論這些線(除了glColor4x一個)與圖形靜止顯示完全相同。如果您將左下角座標作爲原點,圖形顯示器將以其預期尺寸顯示,不會失真,甚至在正確的位置。下面是我的紋理繪圖程序,作爲代表一個可繪製對象類的一部分:

public void draw(GL10 gl, float x, float y) { 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
    cropSignature = OpenGLUtil.setTextureCrop(gl,srcRectParam,cropSignature); 
    ((GL11Ext)gl).glDrawTexfOES(x, y, 0, width, height); 
} 

其中x,y是在繪製座標,寬度,高度都質感的尺寸,在實例指定這個對象。

glDrawTexfOES是否完全繞過了我建立的視口設置?如果是這樣,我應該如何繪畫?我怎樣才能將OpenGL原點設置在左上方,向下增加?或者那是不好的做法,我應該顛倒我的代碼的其餘部分以符合這一點?

+0

你似乎缺少設置矩陣你分配正交投影。在加載單位矩陣之前,您可以嘗試添加'gl.glMatrixMode(GL10.GL_PROJECTION)'。 – harism 2011-05-12 20:13:04

+0

@harism設置這個沒有什麼區別 – Klazen108 2011-05-12 20:32:38

回答

4

改變它的東西是這樣的:

// call only one time, when texture needs to be loaded 
// (also sometimes neccesary after resuming a paused app) 
public void loadTexture() { 
    textureId = gl.glGenTextures(1); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
    cropSignature = OpenGLUtil.setTextureCrop(gl,srcRectParam,cropSignature); 
} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    this.width = width; 
    this.height = height; 
} 

public void draw(GL10 gl, float x, float y) { 
    gl.glViewport(0, 0, width, height); 

    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    if(origin_upper_left) { 
     GLU.gluOrtho2D(gl, 0, width, 0, height); 
    } else { 
     GLU.gluOrtho2D(gl, 0, width, height, 0); 
    } 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 
    ((GL11Ext)gl).glDrawTexfOES(x, y, 0, width, height); 
} 
+0

嘗試了這個,發生了同樣的問題。 – Klazen108 2011-05-12 20:29:06

+0

啊對不起,我錯過了你想要左上角的原點。很簡單。看我的編輯。 – datenwolf 2011-05-12 21:02:52

+0

我認爲同樣的事情也會有幫助,將底部和頂部參數翻到gluOrtho2D,但問題似乎是這些語句被忽略。如果我使用你的代碼,或者即使用「30」和「30」或其他一些隨機值替換「寬度」和「高度」,所有內容仍然顯示爲沒有任何變化。 – Klazen108 2011-05-12 21:10:03