Android OpenGL ES et 2D


95

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

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

J'ai aussi essayé de lire du code source (ex.: Replica island) mais les codes sont trop compliqués et contiennent beaucoup de choses qui ne sont pas nécessaires; résultat: je me perds parmi 100 fichiers .java avec des noms de classe et des trucs bizarres.

Je suppose qu'il n'y a pas de cours comme celui que je recherche, mais je serai très heureux si quelqu'un pouvait me donner des directives et des liens peut-être pour savoir ce que je fais (uniquement le rendu OpenGL ES 2D Sprites! Rien 3D ).


33
and I'm not willing to learn itCe n'est pas une très bonne façon de commencer une question ici
Falmarri

62
Veuillez lire toute ma question, vous en avez pris une partie sensible et avez laissé l'achèvement le plus important: "Je ne connais pas déjà OpenGL, et je ne veux pas l'apprendre, je veux apprendre OpenGL ES directement depuis que je suis cibler mon développement sur Android "Quel est l'intérêt d'apprendre OpenGL si je ne travaille qu'avec OpenGL ES sur des appareils embarqués? Cheers
CoolStraw

5
Étant donné qu'OpenGL ES est principalement un sous-ensemble d'OpenGL, je ne vois pas l'intérêt de dire que vous n'allez pas apprendre OpenGL, car par définition, vous allez devoir le faire.
dash-tom-bang

2
BTW- Replica Island est à peu près l'endroit à regarder. Vous pourriez commencer par cela et commencer par y apporter des modifications. Supprimez les choses que vous ne voulez pas ou dont vous n'avez pas besoin, puis 100 classes deviennent 99 puis 98 puis 97 ...
dash-tom-bang

Réponses:


85

J'étais dans une situation similaire.
La façon dont j'ai commencé avec openGL a commencé par regarder les exemples / démos GLSurfaceView très basiques.

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

Prenez un butin dans le fichier de code source de l'île de réplique: GameRenderer.java pour savoir comment configurer votre canevas avec les indicateurs GL appropriés pour le rendu 2D (sprite). Vous devriez vraiment jeter un œil à SpriteMethodTest du même auteur de replica island: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

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

Après avoir configuré votre canevas, vous commencez par appeler quelque chose comme: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Après cela, vous êtes prêt à rendre un sprite. Tout d'abord, vous devrez 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é avec le chargement des sprites: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Voici comment je 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 permettre de dessiner des sprites 2D sur un canevas openGL. J'ai remarqué qu'il n'y a vraiment pas de tutoriel simple à ce sujet. J'espère qu'à l'avenir j'en publierai un dans mon blog de développement: http://developingthedream.blogspot.com/


7
Mec merci beaucoup! Je n'ai jamais eu de directions comme celles-ci, c'est exactement ce que je cherchais! Et je garderai un œil sur votre blog, j'espère que vous nous fournirez un excellent tutoriel à l'avenir :), Encore une fois merci beaucoup
CoolStraw

1
Dans la même situation qu'OP et aussi reconnaissant que lui pour votre réponse. Bonne chance avec votre jeu / blog. merci encore
unR

1
Merci @Miguel Morales J'en avais marre de chercher un dessin 2D avec GL. Comme CoolStraw l'a dit, il y a trop de didacticiels contenant beaucoup de choses inutiles. Cette réponse était claire comme un cristal.
Evren Ozturk

@Miguel Morales Après de nombreux essais, je ne peux rien dessiner si mes textures sont noires. J'ai posé une question stackoverflow.com/questions/9624260/… pouvez-vous jeter un oeil?
Evren Ozturk

12

La programmation 2D n'est que de la programmation 3D contrainte à un plan. Vous n'aurez pas 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/


8
Pour être pédant, vous utilisez toujours Z afin que vous puissiez laisser le matériel faire le tri pour vous. Le grand changement est que (probablement) l'application 2D utilisera une vue orthographique au lieu d'une vue en perspective.
dash-tom-bang

Merci beaucoup pour votre réponse, votre déclaration me montre que je me suis trompé sur la définition d'Opengl et d'Opengl ES.
CoolStraw

3

Je reviendrais certainement sur Android - Chris Pruett Google IO conférence Écrire des jeux en temps réel pour Android Redux

prenez aussi le PDF

c'est vraiment utile à plusieurs niveaux, Chris a une très bonne 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 est Flash + AdobeAIR vers Android, j'aime moi-même et aime le niveau de programmation et au fur et à mesure que vous commencez à développer, vous découvrirez pourquoi.

OpenGL: Vérifier - Nehe Productions

quelques applications que vous voudrez peut-être installer sur votre téléphone qui en valent la peine et qui sont gratuites: OpenGL Demo, min3d Framework, RedBook Sample



0

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

J'ai commencé avec une seule expérience en programmation, sans aucune expérience OpenGL. J'ai utilisé le site de tutoriels de Ray Wenderlich. Les informations qui y sont fournies sont de premier ordre et faciles à comprendre. Il coupe 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.

Apprentissage d'OpenGL ES pour la pochette de livre iOS

Certains l'ont critiqué en disant qu'il é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 créer 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 à eux deux pour le partage !!!


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.