web-dev-qa-db-fra.com

Android OpenGL ES et 2D

Eh bien, voici ma demande. Je ne connais pas encore OpenGL et je ne souhaite pas l'apprendre. Je veux apprendre directement à OpenGL ES, car je cible mon développement sous Android. Je veux apprendre OpenGL ES afin de développer mes 2D jeux. Je l’ai choisi pour des raisons de performances (car le dessin de SurfaceView de base n’est pas aussi efficace en ce qui concerne les jeux RT) . Ma question est la suivante: par où commencer? J'ai passé plus d’un mois à naviguer sur notre site. J'ai lu et essayé quelques tutoriels/exemples que j'ai trouvés n'importe où, mais pour être honnête, cela n'a pas beaucoup aidé et c'est pour deux raisons:

  1. Presque tous les articles/tutoriels que j'ai rencontrés sont liés à la 3D (je veux seulement apprendre à dessiner des Sprites 2D)
  2. Il n'y a pas de base de départ puisque tous les articles visent des choses spécifiques telles que "Comment dessiner un triangle (avec des sommets)", "Comment créer un maillage" ... etc.

J'ai aussi essayé de lire du code source (ex.: Réplica island) mais les codes sont trop compliqués et contiennent beaucoup de choses inutiles. résultat: je me perds parmi 100 fichiers .Java avec des noms de classes étranges.

Je suppose qu’il n’ya pas de cours comme celui que je cherche, mais je serais très heureux si quelqu'un pouvait me donner des directives et des liens / pour peut-être apprendre ce que je prépare (uniquement des Sprites 2D OpenGL ES rendu! rien en 3D).

93
CoolStraw

J'étais dans une situation similaire.
La façon dont j'ai commencé avec openGL en commençant par regarder les échantillons/démos très élémentaires de GLSurfaceView. 

Commencez par configurer l'activité de votre application, puis configurez le canevas de base.

Découvrez le fichier de code source de l’île réplique: GameRenderer.Java pour savoir comment configurer votre canevas avec les drapeaux GL appropriés pour le rendu 2D (Sprite) . Vous devriez vraiment jeter un coup d’œil à SpriteMethodTest auteur de l'île répliquée: http://code.google.com/p/apps-for-Android/source/browse/trunk/SpriteMethodTest

Voir cette question où j'ai posté mon propre code: Utiliser OpenGL pour remplacer Canvas - Android

Une fois que vous avez configuré votre canevas, vous commencez par appeler quelque chose comme: Gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Après cela, vous êtes prêt à générer un Sprite . Tout d'abord, vous devez charger le Sprite dans une texture: http://qdevarena.blogspot.com/2009/02/how-to-load- texture-in-Android-opengl.html

Cependant, c’est le tutoriel qui m’a vraiment aidé à charger les sprites: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Voici comment je le fais, j'ai une classe nommée Texture.Java:

public class Texture
{
    /*Begin public declarations*/
    public float x = 0;
    public float y = 0;
    public float z = 0;
    public float width = 0;
    public float height = 0;
    /*Begin Private Declarations*/
    private GL10 gl;
    public int[] texture;    //holds the texture in integer form
    private int texture_name;
    private int[] mCropWorkspace;
    private final BitmapFactory.Options sBitmapOptions;


/*Begin Methods*/
public Texture( GL10 gl_obj )
{
    gl = gl_obj;
    texture = new int[1];
    mCropWorkspace = new int[4];
    sBitmapOptions = new BitmapFactory.Options();
    sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
    //Log.d(TAG, "Initializing Texture Object");
}    
public int get_texture_name( )
{
    return texture_name;
}

/*Loads the resource to memory*/
public boolean Load( Bitmap bitmap ) //rename this to glLoad and don't have it as an initializer parameter
{
    /*many thanks to Sprite method test if this works*/
    if ( gl == null )
    {
        Log.e(TAG, "Failed to load resource.  Context/GL is NULL");
        return false;
    }
    int error;

    int textureName = -1;
    gl.glGenTextures(1, texture, 0);
    textureName = texture[0];

    //Log.d(TAG, "Generated texture: " + textureName);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_Edge);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_Edge);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    mCropWorkspace[0] = 0;
    mCropWorkspace[1] = bitmap.getHeight();
    mCropWorkspace[2] = bitmap.getWidth();
    mCropWorkspace[3] = -bitmap.getHeight();

    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
            GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0);

    error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR)
    { 
        Log.e(TAG, "GL Texture Load Error: " + error);

    }
    //Log.d(TAG, "Loaded texture: " + textureName);
    return true;
 }
}

Ensuite, dans ma méthode onDrawFrame (), je fais simplement:

Texture texture = ...
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.texture[0]);
((GL11Ext) gl).glDrawTexfOES((float)(draw_x + 0.5), (float)(draw_y + 0.5), 0, tile_width, tile_height);

Cela devrait vous aider à dessiner des sprites 2D sur une toile openGL . J'ai remarqué qu'il n'y a pas vraiment de tutoriel simple à ce sujet. J'espère pouvoir en publier un dans mon blog dev: http://developingthedream.blogspot.com/

85
Miguel Morales

La programmation 2D est simplement une programmation 3D qui est contrainte à un plan. Vous n'aurez d'autre choix que d'apprendre la 3D, mais lorsque vous l'utilisez, définissez simplement z = 0.

Il existe un livre officiel sur OpenGL ES. Cela pourrait vous donner l'intro que vous recherchez: http://www.Amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

12

Je voudrais certainement commander Android - Chris Pruett Google IO lecture Écrire des jeux en temps réel pour Android redux

saisir le PDF également

c'est vraiment utile à plusieurs niveaux, Chris a vraiment une grande expérience dans la création de jeux pour appareils mobiles 

mais si vous êtes vraiment concentré sur la 2D, commencez par Canvas http://developer.Android.com/guide/topics/graphics/index.html#drawing-with-canvas

Une autre option dépend du niveau de compétence: Flash + AdobeAIR sur Android, j'aime moi-même et le niveau de programmation et, au fur et à mesure que vous avancez dans le développement, vous apprendrez pourquoi.

OpenGL: À vérifier - Nehe Productions

quelques applications à ajouter à votre téléphone qui en valent la peine et qui sont gratuites sont: Démo OpenGL, Framework min3d, Exemple RedBook

3
Atom Arcade

Vous pouvez voir le projet: https://github.com/ChillingVan/Android-openGL-canvas/blob/master/README-en.md Ceci implémente canvas avec OpenGL. C'est du pur Java. Il implémente des parties de ce que peut faire une toile normale. 

1
ChillingVan

Vous pouvez suivre de nombreux tutoriels en ligne, mais rien ne remplace, pour un débutant, celui-ci: Un vrai tutoriel Open GL ES 2.0 2D

0
ucMedia

Je vois que beaucoup de bonnes informations ont déjà été fournies. Je voulais partager un site qui a permis de se familiariser rapidement avec OpenGLE! Cela n'a pris que quelques mois et un système de coordonnées personnalisé basé sur le système de coordonnées cartésien. J'ai été capable de rendre l'objet 3D sans caméra en utilisant des techniques de réalité augmentée. 

J'ai commencé avec uniquement une expérience en programmation, sans expérience OpenGL. J'ai utilisé le site de tutoriels de Ray Wenderlich. Les informations fournies sont excellentes et faciles à comprendre. Il supprime la plupart des informations superflues et fournit ce que vous devez savoir pour être productif rapidement. Je recommande vivement ce tutoriel comme point de départ: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

L'autre ressource que je recommanderais est un livre d'Erik M Buck, intitulé Learning OpenGL ES pour iOS. 

Learning OpenGL ES for iOS book cover art

Certains l'ont critiqué en disant que c'était trop simpliste. Mais c'est exactement ce que je cherchais. Cela m'a aidé à comprendre toutes les bases et m'a donné une idée de l'endroit où je devrais aller pour apprendre des choses plus avancées. Mais sans surprise, j'ai pu construire mon application de réalité augmentée en utilisant les techniques simples que j'avais apprises sur le site de Ray et le livre d'Erik. Merci à tous les deux pour le partage !!! 

0
MikeyE