2010-08-30 18 views
8

Estoy intentando reemplazar el sistema de renderizado basado en Canvas que ya tengo con la superficie opengl-es más rápida, sin embargo, parece que no puedo obtener un renderizador OpenGL para conformarme en tal forma en que actúa como campo 2d, en lugar de una vista en perspectiva.Uso de OpenGL para reemplazar Canvas - Android

Mi código actual para el procesador se ve de la siguiente manera:

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

¿Cómo voy a configurar el procesador de modo que la transformación traducir coincidiría con los píxeles en la pantalla? (así que traducir 5 a la derecha lo movería 5 píxeles)

+0

¿Por qué no utilizar simplemente pasar una instancia GL al constructor Canvas? http://developer.android.com/reference/android/graphics/Canvas.html –

+0

¿Eso retendría los beneficios de velocidad de OpenGL sobre el lienzo básico en el dibujo de Bitmaps? – GuyNoir

+0

No use Canvas para ello. No funciona aunque esté documentado. Además, según las conversaciones en IRC, el desarrollador de Canvas ya lo ha eliminado de la API para futuras versiones. – Moncader

Respuesta

9

Tenga en cuenta que en OpenGL esa coordenada Y se invierte. De lo contrario, todo es lo mismo.
En cuanto a las banderas correctas, le recomiendo que echa un vistazo a la isla de código abierto juego para Android réplica: http://code.google.com/p/replicaisland/

Esto es lo que utilizo en mi propio código:

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

Dónde mViewWidth & mViewHeight son del tamaño de la pantalla.

+0

Tengo, sin embargo, el código es tan grueso con optimizaciones y sistemas basados ​​en mosaico, que es bastante inútil encontrar el código simple que necesito para representar algunas texturas en la pantalla. – GuyNoir

+0

Tuve un problema similar y no tuve problemas para encontrar la parte donde el autor de las réplicas de las islas configuró el lienzo gl. Está en el archivo llamado GameRenderer.java. He editado la respuesta original para incluir el código de configuración que uso. –

+0

Muy bien, gracias. Aunque todavía no está funcionando en términos de transición de mi estructura de código general. ¿Hay alguna forma de almacenar texturas en tamaños que no sean de base 2? Si no es así, realmente no vale la pena usar OpenGL de todos modos (ya estoy presionando los límites de memoria de Android). – GuyNoir