2010-08-24 14 views
92

Bene, ecco la mia richiesta. Non conosco già OpenGL, e non sono disposto a impararlo, voglio imparare OpenGL ES direttamente dal momento che sto indirizzando il mio sviluppo ad Android, comunque. Voglio imparare OpenGL ES per sviluppare i miei giochi 2D 2D. L'ho scelto a scopo di performance (dal momento che il disegno di base di SurfaceView non è così efficiente quando si tratta di giochi RT). La mia domanda è: da dove cominciare? Ho trascorso più di un mese di navigazione di Google e di lettura/cercando qualche tutorial/esempi che ho trovato da nessuna parte, ma ad essere onesti, non ha aiutato molto e questo è per due motivi:Android OpenGL ES e 2D

  1. Quasi tutti gli articoli/tutorial che ho trovato sono correlati in 3D (voglio solo imparare come fare il mio disegno in 2D Sprites)
  2. Non c'è una base da cui partire, poiché tutti gli articoli si rivolgono a cose specifiche come: "Come disegnare un triangolo (con vertici) "," Come creare una maglia "... ecc.

Ho provato a ri anche alcuni codici sorgente (es .: isola di replica) ma i codici sono troppo complicati e contengono molte cose che non sono necessarie; risultato: mi perdo tra 100 file .java con nomi di classi e cose strane.

Immagino che non ci sia mai un corso come quello che sto cercando, ma sarei molto felice se qualcuno potesse darmi alcune linee guida e alcuni link forse per imparare cosa sto facendo (solo OpenGL ES Rendering 2D sprites! Niente 3D).

+32

'e non sono disposto ad apprenderlo '. Non è un ottimo modo per iniziare una domanda qui – Falmarri

+56

Per favore, leggi tutta la mia domanda, ne hai preso una parte sensibile e hai lasciato il completamento più importante:" I don " so già OpenGL, e non sono disposto a impararlo, voglio imparare OpenGL ES direttamente dal momento che sto indirizzando il mio sviluppo ad Android " Qual è il punto di apprendimento di OpenGL se ho intenzione di lavorare solo con OpenGL ES su dispositivi embedded? Cheers – CoolStraw

+5

Dato che OpenGL ES è principalmente un sottoinsieme di OpenGL, non vedo il punto di dire che non imparerai OpenGL, dal momento che per definizione dovrai farlo. –

risposta

84

Mi trovavo in una situazione simile.
Il modo in cui ho iniziato con openGL inizia guardando gli esempi/demo di base di GLSurfaceView.

Inizia, impostando l'attività dell'app e impostando la tela di base.

Fai un bottino sul file del codice sorgente dell'isola di replica: GameRenderer.java per come configurare il tuo quadro con i flag GL corretti per il rendering 2D (sprite). Si dovrebbe davvero dare un'occhiata al SpriteMethodTest dallo stesso autore di replica dell'isola: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Vedere questa domanda in cui ho postato il mio codice: Using OpenGL to replace Canvas - Android

Dopo aver la tela impostato, si avvia chiamando qualcosa come: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Dopodiché sei pronto per il rendering di uno sprite. In primo luogo, è necessario caricare la sprite in una texture: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Tuttavia, questo è il tutorial che mi ha veramente aiutato con sprites di carico: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

questo è come lo faccio, ho una classe denominata 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; 
} 
} 

Poi nel mio onDrawFrame() metodo faccio semplicemente:

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

Questo dovrebbe portare a disegnare sprite 2D su una tela openGL. Ho notato che non c'è davvero un tutorial diretto su questo. Speriamo che in futuro posterò uno nel mio blog dev: http://developingthedream.blogspot.com/

+6

Amico grazie mille! Non ho mai ottenuto indicazioni come queste, è esattamente quello che stavo cercando! E terrò d'occhio il tuo blog, spero che ci fornirai un ottimo tutorial in futuro :), ancora grazie mille – CoolStraw

+1

nella stessa situazione di OP e ringraziandolo per la tua risposta. Buona fortuna con il tuo gioco/blog. grazie ancora – unR

+1

Grazie @Miguel Morales Ero stanco di cercare il disegno 2D con GL. Come dice CoolStraw, ci sono troppi tutorial con molte cose inutili. Quella risposta era chiara come un cristallo. –

11

La programmazione 2D è solo una programmazione 3D vincolata a un piano. Non avrai altra scelta che imparare il 3D, ma quando lo stai usando basta impostare z = 0.

C'è un libro ufficiale su OpenGL ES. Questo potrebbe dare l'intro che siete dopo: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

+7

Per essere pedante, usi ancora Z in modo che tu possa lasciare che l'hardware faccia l'ordinamento per te. Il grande cambiamento è che (probabilmente) l'applicazione 2D utilizzerà una vista ortografica invece di una prospettiva. –

+0

Grazie mille per la tua risposta, la tua affermazione mi mostra che mi sbagliavo sulla definizione Opengl e Opengl ES. – CoolStraw

2

senz'altro cassa Android - Chris Pruett Google IO conferenza Scrittura giochi in tempo reale per Android redux

afferrare il PDF anche

è davvero utile su molti livelli, Chris ha davvero una grande esperienza con la creazione di giochi per dispositivi mobili

ma se si è veramente concentrati su 2D allora si inizia con Canvas http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Un'altra opzione dipende dal livello di abilità è Flash + AdobeAIR ad Android, io stesso mi piace e livello di programmazione luv e mentre inizi a sviluppare scoprirai perché.

OpenGL: Controllare - Nehe Productions

un paio di applicazioni che si può decidere di mettere sul tuo telefono cellulare che è valsa la pena e sono liberi è: OpenGL demo, Framework min3d, RedBook Campione

1

Vedo un sacco di buone informazioni è già stato fornito. Volevo condividere un sito che ha aiutato ad accelerare su OpenGLE veloce! Ci sono voluti solo pochi mesi e disponeva di un sistema di coordinate personalizzate basato sul sistema di coordinate cartesiane. Sono stato in grado di renderizzare oggetti 3D senza fotocamera usando tecniche di Realtà Aumentata.

Ho iniziato solo con esperienza di programmazione, senza esperienza OpenGL. Ho usato il sito tutoriale di Ray Wenderlich. Le informazioni fornite sono di prim'ordine e facili da comprendere. Elimina la maggior parte delle informazioni superflue e fornisce ciò che è necessario sapere per essere produttivi rapidamente. Consiglio vivamente questo tutorial come punto di partenza: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

L'altra risorsa che consiglierei è un libro di Erik M Buck, intitolato Learning OpenGL ES per iOS.

Learning OpenGL ES for iOS book cover art

Alcuni hanno criticato dicendo che era troppo semplicistico. Ma questo è esattamente quello che stavo cercando. Mi ha aiutato a capire tutte le basi e mi ha dato un'idea su dove dovrei andare per imparare cose più avanzate. Ma non sorprendentemente, sono stato in grado di costruire la mia app di realtà aumentata usando le semplici tecniche che avevo imparato dal sito di Ray e dal libro di Erik. Grazie a loro entrambi per la condivisione !!!