2010-08-30 14 views
8

Sto tentando di sostituire il sistema di rendering basato su Canvas che ho già con la superficie più veloce degli opengl, tuttavia, non riesco a ottenere un renderer openGL conforme a tale in modo che agisca come un campo 2D, piuttosto che in una vista prospettica.Uso di OpenGL per sostituire Canvas - Android

mio codice corrente per il renderer si presenta come segue:

 @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);  
    } 

Come faccio a impostare il renderer in modo che la trasformazione di tradurre sarebbe partita con i pixel sullo schermo? (quindi la traslazione di 5 a destra lo sposterebbe di 5 pixel)

+0

Perché non utilizzare semplicemente passare un'istanza GL al costruttore Canvas. http://developer.android.com/reference/android/graphics/Canvas.html –

+0

Ciò manterrebbe i vantaggi della velocità di openGL sulla tela di base nel disegno di bitmap? – GuyNoir

+0

Non usare Canvas per questo. Non funziona anche se è documentato. Inoltre, secondo i talk in IRC, lo sviluppatore di Canvas l'ha già rimosso dall'API per le versioni future. – Moncader

risposta

9

Si noti che in openGL la coordinata Y è invertita. Altrimenti tutto è uguale.
Per quanto riguarda le bandiere giuste, vi consiglio di controllare l'isola open source gioco per Android replica: http://code.google.com/p/replicaisland/

Ecco quello che uso nel mio codice:

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); 
} 

Dove mViewWidth & mViewHeight sono le dimensioni del il display.

+0

Ho, tuttavia, il codice è così spesso con ottimizzazioni e sistemi basati su tile, che è praticamente inutile trovare il codice semplice di cui ho bisogno per rendere alcune trame sullo schermo. – GuyNoir

+0

Ho avuto un problema simile e non ho avuto problemi a trovare la parte in cui l'autore delle isole di replica ha impostato la gl-canvas. È nel file chiamato GameRenderer.java. Ho modificato la mia risposta originale per includere il codice di configurazione che utilizzo. –

+0

OK, grazie. Anche se non si sta ancora delineando in termini di transizione della mia struttura generale del codice. Esiste un modo per memorizzare le trame nelle dimensioni non di base 2? Se non c'è, non vale la pena di usare comunque openGL (sto già spingendo i limiti di memoria di Android). – GuyNoir