2012-04-02 95 views
0

我使用Android的OpenGL繪製2D圖像。Android OpenGL es「glDrawTexfOES」繪製倒立

每當我使用的代碼畫點什麼:

gl.glViewport(aspectRatioOffset, 0, screenWidth, screenHeight); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 

    GLU.gluOrtho2D(gl, aspectRatioOffset, screenWidth + aspectRatioOffset,screenHeight, 0); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, myScene.neededGraphics.get(ID).get(animationID).get(animationIndex)); 

    crop[0] = 0; 
    crop[1] = 0; 
    crop[2] = width; 
    crop[3] = height; 
    ((GL11Ext)gl).glDrawTexfOES(x, y, z, width, height) 

我得到一個倒置的結果。我心中已經看過的人通過這樣做解決這個問題:

crop[0] = 0; 
    crop[1] = height; 
    crop[2] = width; 
    crop[3] = -height; 

但這不過傷邏輯在我的應用程序,所以我想結果不被顛倒翻轉。有誰知道它爲什麼發生,以及避免或解決它的任何方式?

編輯:我發現了一個解決方案,但我不知道這是否是一個很好的一個:

int[] crop = new int[4]; 
    crop[0] = 0; 
    crop[1] = imageDimension[ID][1]; 
    crop[2] = imageDimension[ID][0]; 
    crop[3] = -imageDimension[ID][1]; 

    ((GL11)gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0); 
    ((GL11Ext)gl).glDrawTexfOES(x, ScreenHeight - y - height, 0, width, height); 

回答

3

定義倒掛。 OpenGL定義(0,0)位於顯示器的左下角,y向上。 glDrawTexOES明確定義爲在窗口座標中工作,所以即使在ES 1.0中也沒有矩陣堆棧。如果您已將投影或模型視圖矩陣設置爲將座標翻轉爲OpenGL認爲顛倒的任何座標,則在調用glDrawTexOES期間不會產生任何影響。

通常會發生的情況是,人們在加載圖形時會隱式地翻轉它們的圖形(因爲它們忽略了OpenGL放置原點),導致它們在使用glDrawTexOES時顛倒。正確的解決方案是,如果您不想稍後手動翻轉座標,則在加載圖像和/或設置矩陣堆棧時不要隱式翻轉它們。

+0

我對OpenGL很陌生,剛開始嘗試將使用Canvas的項目轉換爲使用更高效的東西。在這一步之前我很可能會犯錯,我會仔細看看。 – Alle 2012-04-02 23:19:35

+0

我認爲除了嘗試插入一個紋理加載系統,假定您更願意將存儲紋理視爲左上角的原點並將其他位置的紋理座標修復爲「glDrawTexOES」 ,與API的其餘部分幾乎不同,它需要直接的窗口座標,所以你不會有機會不可見地翻轉座標。 – Tommy 2012-04-02 23:22:22

+0

如果我理解正確,我的代碼應該已經翻轉了圖像,但我不想這樣做,因爲glDrawTexOES具有與Canvas相同的座標系統? – Alle 2012-04-02 23:36:33