2010-08-30 53 views
8

我正試圖取代基於畫布的渲染系統,我已經有了更快的opengl-es表面,但是,我似乎無法得到一個openGL渲染器來符合這樣的它作爲二維場而不是透視圖。使用OpenGL替換畫布 - Android

我的渲​​染器當前代碼如下:

 @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f); 

     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
     gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

     gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 

     gl.glDisable(GL10.GL_DITHER); 
     gl.glDisable(GL10.GL_LIGHTING); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    } 

我將如何設置渲染器,以便翻譯轉型將匹配了屏幕上的像素? (所以翻譯右5會移動5個像素)

+0

爲什麼不使用GL實例傳遞給Canvas構造函數。 http://developer.android.com/reference/android/graphics/Canvas.html – 2010-08-30 01:32:40

+0

在繪製位圖時,它會保持openGL的速度優於基本畫布嗎? – GuyNoir 2010-08-30 01:45:36

+0

請勿使用Canvas。即使記錄在案,它也不起作用。另外,根據IRC的談話,Canvas的開發人員已經將其從API中移除以用於將來的版本。 – Moncader 2010-09-08 09:03:28

回答

9

請注意,在openGL中,Y座標是倒置的。否則,所有的都是一樣的。
至於正確的標誌,我建議你看看開源的Android遊戲副本島:http://code.google.com/p/replicaisland/

這是我在我自己的代碼中使用:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    mViewWidth = width; 
    mViewHeight = height; 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

mViewWidth & mViewHeight是大小顯示器。

+0

但是,我的代碼非常厚,優化和基於圖塊的系統非常簡單,找到我需要的簡單代碼來渲染一些紋理到屏幕上幾乎是沒有用的。 – GuyNoir 2010-09-03 22:00:39

+0

我有一個類似的問題,並沒有問題找到複製品島的作者設置GL畫布的部分。它在名爲GameRenderer.java的文件中。 我編輯了我的原始響應以包含我使用的設置代碼。 – 2010-09-03 22:25:32

+0

好的,謝謝。儘管在轉換我的整體代碼結構方面仍然沒有很好的工作。有沒有辦法將紋理存儲爲非base-2尺寸?如果沒有,真的不值得使用openGL的麻煩(我已經推動了Android的內存限制)。 – GuyNoir 2010-09-15 23:02:01