2010-08-30 3 views
8

Je tente de remplacer le système de rendu basé sur le canevas que j'ai déjà par la surface d'ouverture plus rapide, cependant, je n'arrive pas à obtenir un rendu openGL pour se conformer dans un tel manière qu'il agit comme champ 2d, plutôt que d'une vue en perspective.Utilisation d'OpenGL pour remplacer Canvas - Android

Mon code actuel pour le moteur de rendu se présente comme suit:

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

Comment puis-je configurer le moteur de rendu pour que la transformation translate correspondrait avec les pixels sur l'écran? (donc translater 5 vers la droite le déplacerait de 5 pixels)

+0

Pourquoi ne pas simplement passer une instance GL au constructeur Canvas. http://developer.android.com/reference/android/graphics/Canvas.html –

+0

Est-ce que cela conserverait les avantages de vitesse d'openGL sur le canevas de base dans le dessin Bitmaps? – GuyNoir

+0

N'utilisez pas Canvas pour cela. Cela ne fonctionne pas même si c'est documenté. En outre, selon les discussions en IRC, le développeur de Canvas l'a déjà retiré de l'API pour les futures versions. – Moncader

Répondre

9

Veuillez noter que dans openGL, la coordonnée Y est inversée. Sinon, tout est pareil.
En ce qui concerne les drapeaux corrects, je vous recommande de vérifier l'île réplique de jeu Android open source: http://code.google.com/p/replicaisland/

Voici ce que j'utilise dans mon propre code:

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 sont la taille l'affichage.

+0

J'ai, cependant, le code est si épais avec des optimisations et des systèmes basés sur les tuiles, qu'il est pratiquement inutile de trouver le code simple dont j'ai besoin pour rendre quelques textures à l'écran. – GuyNoir

+0

J'ai eu un problème similaire et n'ai eu aucun problème à trouver la partie où l'auteur des répliques a configuré le canvas gl. C'est dans le fichier appelé GameRenderer.java. J'ai modifié ma réponse d'origine pour inclure le code d'installation que j'utilise. –

+0

Très bien, merci. Bien que cela ne fonctionne pas encore en termes de transition de ma structure de code globale. Est-il possible de stocker des textures dans des tailles autres que celles de base-2? S'il n'y en a pas, ça ne vaut pas vraiment la peine d'utiliser openGL de toute façon (je repousse déjà les limites de mémoire d'Android). – GuyNoir

Questions connexes