Android OpenGL ES dan 2D

96

Nah, inilah permintaan saya. Saya belum tahu OpenGL, dan saya tidak mau mempelajarinya, saya ingin belajar OpenGL ES secara langsung karena saya menargetkan pengembangan saya ke android. Saya ingin belajar OpenGL ES untuk mengembangkan game 2D saya . Saya memilihnya untuk tujuan pertunjukan (karena gambar SurfaceView dasar tidak seefisien itu dalam hal game RT). Pertanyaan saya adalah: mulai dari mana? Saya telah menghabiskan lebih dari sebulan menjelajahi Google dan membaca / mencoba beberapa tutorial / contoh yang saya temukan di mana saja tetapi sejujurnya, itu tidak banyak membantu dan ini karena dua alasan:

  1. Hampir semua artikel / tutorial yang saya temui terkait dengan 3D (saya hanya ingin belajar cara menggambar 2D Sprite)
  2. Tidak ada dasar untuk memulai karena semua artikel menargetkan hal-hal tertentu seperti: "Cara menggambar segitiga (dengan simpul)", "Cara membuat Jala" ... dll.

Saya sudah mencoba membaca beberapa kode sumber juga (mis .: pulau replika) tetapi kodenya terlalu rumit dan berisi banyak hal yang tidak perlu; Hasil: Saya tersesat di antara 100 file .java dengan nama kelas yang aneh dan semacamnya.

Saya kira tidak ada kursus seperti yang saya cari, tetapi saya akan sangat senang jika seseorang dapat memberi saya beberapa pedoman dan beberapa tautan mungkin untuk mempelajari apa yang saya lakukan (hanya rendering Sprite OpenGL ES 2D! Tidak ada 3D ).

CoolStraw
sumber
33
and I'm not willing to learn itItu bukan cara yang baik untuk memulai pertanyaan di sini
Falmarri
62
Silakan baca seluruh pertanyaan saya, Anda mengambil satu bagian sensitif darinya dan meninggalkan penyelesaian terpenting: "Saya belum tahu OpenGL, dan saya tidak mau mempelajarinya, saya ingin belajar OpenGL ES secara langsung karena saya menargetkan pengembangan saya ke android "Apa gunanya mempelajari OpenGL jika saya hanya akan bekerja dengan OpenGL ES pada perangkat yang disematkan? Cheers
CoolStraw
5
Mengingat bahwa OpenGL ES sebagian besar merupakan subset dari OpenGL, saya tidak melihat gunanya mengatakan Anda tidak akan belajar OpenGL, karena menurut definisi Anda harus melakukannya.
dash-tom-bang
2
BTW- Replica Island adalah tempat yang tepat untuk dilihat. Anda bisa mulai dengan itu dan mulai dengan mengubahnya. Hapus hal-hal yang tidak Anda inginkan atau butuhkan, dan kemudian 100 kelas menjadi 99 lalu 98 lalu 97 ...
dash-tom-bang

Jawaban:

85

Saya berada dalam situasi yang sama.
Cara saya memulai openGL dengan memulai dengan melihat sampel / demo GLSurfaceView yang sangat dasar.

Mulailah, dengan menyiapkan aktivitas aplikasi Anda, dan siapkan kanvas dasar.

Ambil rampasan di file kode sumber pulau replika: GameRenderer.java untuk mengetahui cara menyiapkan kanvas Anda dengan bendera GL yang tepat untuk rendering 2D (sprite). Anda harus benar-benar melihat SpriteMethodTest oleh penulis pulau replika yang sama: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Lihat pertanyaan ini di mana saya memposting kode saya sendiri: Menggunakan OpenGL untuk menggantikan Canvas - Android

Setelah kanvas Anda siap, Anda mulai dengan memanggil sesuatu seperti: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Setelah itu Anda siap membuat sprite. Pertama, Anda harus memuat sprite ke dalam tekstur: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Namun, ini adalah tutorial yang sangat membantu saya dalam memuat sprite: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Beginilah cara saya melakukannya, saya memiliki kelas bernama 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;
 }
}

Kemudian dalam metode onDrawFrame () saya, saya cukup melakukan:

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

Itu akan membantu Anda menggambar sprite 2D pada kanvas openGL. Saya perhatikan bahwa sebenarnya tidak ada tutorial langsung tentang ini. Semoga kedepannya saya posting di blog dev saya: http://developingthedream.blogspot.com/

Miguel Morales
sumber
7
Bung, terima kasih banyak! Saya tidak pernah mendapatkan petunjuk arah seperti ini, itulah yang saya cari! Dan saya akan mengawasi blog Anda, semoga Anda akan memberi kami tutorial yang bagus di masa mendatang :), Sekali lagi terima kasih banyak
CoolStraw
1
Dalam situasi yang sama seperti OP dan berterima kasih padanya atas jawaban Anda. Semoga berhasil dengan Game / Blog Anda.
terima kasih
1
Terima kasih @Miguel Morales saya sudah bosan mencari gambar 2D dengan GL. Seperti yang dikatakan CoolStraw, ada terlalu banyak tutorial dengan banyak hal yang tidak perlu di dalamnya. Jawaban itu jelas seperti kristal.
Evren Ozturk
@Miguel Morales Setelah banyak mencoba, saya tidak dapat menggambar apa pun karena tekstur saya menjadi hitam. Saya mengajukan pertanyaan stackoverflow.com/questions/9624260/… dapatkah Anda melihatnya?
Evren Ozturk
12

Pemrograman 2D hanyalah pemrograman 3D yang dibatasi pada bidang. Anda tidak akan punya pilihan selain belajar 3D, tetapi saat Anda menggunakannya, setel z = 0.

Ada buku resmi tentang OpenGL ES. Itu mungkin memberi Anda intro yang Anda cari: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

Tidak seorang pun secara khusus
sumber
8
Untuk menjadi pedantic, Anda tetap menggunakan Z sehingga Anda dapat membiarkan perangkat keras melakukan penyortiran untuk Anda. Perubahan besar adalah bahwa (kemungkinan) aplikasi 2D akan menggunakan tampilan ortografik daripada perspektif.
dash-tom-bang
Terima kasih banyak atas jawaban Anda, pernyataan Anda menunjukkan bahwa saya salah tentang definisi Opengl dan Opengl ES.
CoolStraw
3

Saya pasti akan checkout Android - Chris Pruett Google IO kuliah Menulis game real-time untuk Android redux

ambil PDF juga

sangat membantu di banyak level, Chris memiliki pengalaman yang sangat hebat dalam membuat game untuk perangkat seluler

tetapi jika Anda benar-benar fokus pada 2D, mulailah dengan Canvas http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Opsi lain yang bergantung pada tingkat keahlian adalah Flash + AdobeAIR ke Android, saya sendiri suka dan tingkat pemrograman luv dan saat Anda mulai mengembangkannya, Anda akan mengetahui alasannya.

OpenGL: Periksa - Nehe Productions

Beberapa aplikasi yang mungkin ingin Anda pasang di ponsel Anda yang berharga dan gratis adalah: OpenGL Demo, min3d Framework, RedBook Sample

Arkade Atom
sumber
0

Saya melihat banyak info bagus sudah disediakan. Saya ingin berbagi situs yang membantu mempercepat OpenGLE dengan cepat! Hanya butuh beberapa bulan dan memiliki sistem koordinat kustom berdasarkan sistem koordinat Cartesian. Saya dapat membuat objek 3D tanpa kamera menggunakan teknik Augmented Reality.

Saya mulai hanya dengan pengalaman pemrograman, tanpa pengalaman OpenGL. Saya menggunakan situs tutorial Ray Wenderlich. Informasi yang diberikan di sana adalah yang terbaik dan mudah dipahami. Dia memotong sebagian besar informasi yang tidak berguna dan memberikan apa yang perlu Anda ketahui agar cepat produktif. Saya sangat merekomendasikan tutorial ini sebagai titik awal: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Sumber lain yang saya rekomendasikan adalah buku karya Erik M Buck, berjudul Learning OpenGL ES untuk iOS.

Mempelajari OpenGL ES untuk seni sampul buku iOS

Beberapa mengkritiknya dengan mengatakan itu terlalu sederhana. Tapi itulah yang saya cari. Itu membantu saya memahami semua dasar-dasar dan memberi saya ide tentang ke mana saya harus pergi selanjutnya untuk mempelajari lebih banyak hal lanjutan. Namun tidak mengherankan, saya dapat membangun aplikasi augmented reality saya menggunakan teknik sederhana yang saya pelajari dari situs Ray dan buku Erik. Terima kasih kepada mereka berdua untuk berbagi !!!

MikeyE
sumber