Android OpenGL ES ve 2D


96

İşte benim isteğim. OpenGL'yi zaten bilmiyorum ve öğrenmek istemiyorum, ancak geliştirmemi android'e hedeflediğim için doğrudan OpenGL ES öğrenmek istiyorum. 2D oyunlarımı geliştirmek için OpenGL ES öğrenmek istiyorum . Bunu performans amacıyla seçtim (çünkü temel SurfaceView çizimi RT oyunları söz konusu olduğunda o kadar verimli değil). Sorum şu: nereden başlamalı? Google'a göz atmak ve herhangi bir yerde bulduğum bazı öğreticileri / örnekleri okumak / denemek için bir aydan fazla zaman harcadım ama dürüst olmak gerekirse, pek yardımcı olmadı ve bunun iki nedeni var:

  1. Karşılaştığım neredeyse tüm makaleler / öğreticiler 3D ile ilgili (sadece 2D Sprites çizimimi nasıl yapacağımı öğrenmek istiyorum)
  2. Başlamak için bir temel yoktur, çünkü tüm makaleler "Bir üçgen nasıl çizilir (köşeli)", "Ağ nasıl oluşturulur" ... vb.

Bazı kaynak kodlarını da okumaya çalıştım (örneğin: kopya adası) ama kodlar çok karmaşık ve gerekli olmayan pek çok şey içeriyor; sonuç: Garip sınıf isimleri ve benzeri şeyler içeren 100 .java dosyası arasında kayboluyorum.

Sanırım aradığım gibi bir kurs yok, ancak biri bana bazı yönergeler verebilir ve ne yaptığımı öğrenmek için bazı bağlantılar verebilirse çok sevinirim (sadece OpenGL ES 2D Sprites oluşturma! ).


33
and I'm not willing to learn itBu, burada bir soru sormaya başlamanın pek iyi bir yolu değil
Falmarri

62
Lütfen tüm sorumu okuyun, hassas bir bölümünü aldınız ve en önemli tamamlamayı bıraktınız: "Halihazırda OpenGL'yi bilmiyorum ve bunu öğrenmek istemiyorum, OpenGL ES'yi doğrudan öğrenmek istiyorum çünkü geliştirmemi android'e hedefliyor "Gömülü cihazlarda yalnızca OpenGL ES ile çalışacaksam OpenGL öğrenmenin ne anlamı var? Şerefe
CoolStraw

5
OpenGL ES'nin çoğunlukla OpenGL'nin bir alt kümesi olduğu göz önüne alındığında, OpenGL öğrenmeyeceğinizi söylemenin anlamını görmüyorum, çünkü tanım gereği yapmanız gerekecek.
dash-tom-bang

2
BTW- Replica Island, bakılması gereken yer. Bununla başlayabilir ve değişiklik yaparak başlayabilirsiniz. İstemediğiniz ya da ihtiyaç duymadığınız şeyleri çıkarın ve 100 sınıf 99 sonra 98 sonra 97 ...
dash-tom-bang

Yanıtlar:


85

Ben de benzer bir durumdaydım.
OpenGL ile başladığım yol, çok temel GLSurfaceView örneklerine / demolarına bakarak.

Uygulama etkinliğinizi ayarlayarak başlayın ve temel tuvali ayarlayın.

Kanvasınızı 2D (sprite) oluşturma için uygun GL bayraklarıyla nasıl kuracağınızı öğrenmek için kopya ada kaynak kodu dosyasında bir ganimet alın: GameRenderer.java. Replica island'ın aynı yazarının SpriteMethodTest'e gerçekten bir göz atmalısınız: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Kendi kodumu gönderdiğim şu soruya bakın: Canvas'ı değiştirmek için OpenGL'yi kullanma - Android

Kanvasınızı kurduktan sonra, şuna benzer bir şey çağırarak başlayın: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Bundan sonra bir sprite oluşturmaya hazırsınız. Öncelikle hareketli grafiği bir dokuya yüklemeniz gerekir: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Ancak, sprite yüklememde bana gerçekten yardımcı olan öğretici budur: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Ben böyle yaparım, Texture.java adında bir sınıfım var:

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

Sonra onDrawFrame () yöntemimde basitçe şunu yapıyorum:

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

Bu, bir openGL tuval üzerine 2D sprite çizmenizi sağlamalıdır. Bu konuda gerçekten basit bir öğretici olmadığını fark ettim. Umarım gelecekte geliştirici blogumda bir tane yayınlayacağım: http://developingthedream.blogspot.com/


7
Ahbap çok teşekkür ederim! Hiç böyle bir yol tarifi almadım, tam olarak aradığım buydu! Ve blogunuza göz kulak olacağım, umarım gelecekte bize harika eğitimler
sağlarsınız

1
OP ile aynı durumda ve cevabınız için onun kadar minnettarım. Oyununuzda / Blogunuzda iyi şanslar. tekrar thx
unR

1
Teşekkürler @Miguel Morales GL ile 2D çizim aramaktan bıkmıştım. CoolStraw'ın dediği gibi, içinde çok fazla gereksiz şey bulunan çok fazla öğretici var. Bu cevap bir kristal gibi açıktı.
Evren Öztürk

@Miguel Morales Bir sürü denemeden sonra hiçbir şey çizemiyorum dokularım siyah görünüyor. Bir soru sordum stackoverflow.com/questions/9624260/… bir göz atabilir misin?
Evren Öztürk

12

2D programlama, bir düzlemle sınırlı olan yalnızca 3D programlamadır. 3B öğrenmekten başka seçeneğiniz yok, ancak onu kullanırken sadece z = 0 ayarlayın.

OpenGL ES hakkında resmi bir kitap var. Bu size peşinde olduğunuz girişi verebilir: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


8
Bilgiçlikçi olmak için, donanımın sizin için sıralama yapmasına izin vermek için hala Z'yi kullanıyorsunuz. En büyük değişiklik, (muhtemelen) 2D uygulamasının perspektif yerine ortografik bir görünüm kullanmasıdır.
dash-tom-bang

Cevabınız için çok teşekkür ederim, ifadeniz Opengl ve Opengl ES tanımı konusunda yanıldığımı gösteriyor.
CoolStraw

3

Kesinlikle Android'i kontrol ederdim - Chris Pruett Google IO dersi Android için gerçek zamanlı oyunlar yazma

PDF'yi de al

birçok düzeyde gerçekten yararlı, Chris mobil cihazlar için oyun oluşturma konusunda gerçekten harika bir deneyime sahip

ancak gerçekten 2D'ye odaklandıysanız, Canvas ile başlayın http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Diğer bir seçenek beceri düzeyine bağlıdır, Flash + AdobeAIR to Android, ben programlama düzeyini seviyorum ve seviyorum ve geliştirmeye başladığınızda nedenini öğreneceksiniz.

OpenGL: Kontrol Edin - Nehe Productions

telefonunuza koymaya değer ve ücretsiz olan birkaç uygulama: OpenGL Demo, min3d Framework, RedBook Sample



0

Zaten çok sayıda iyi bilgi sağlandığını görüyorum. OpenGLE'de hızlı bir şekilde hızlanmaya yardımcı olan bir site paylaşmak istedim! Yalnızca birkaç ay sürdü ve Kartezyen koordinat sistemine dayalı özel bir koordinat sistemine sahipti. Artırılmış Gerçeklik tekniklerini kullanarak kamerasız 3B nesneyi işleyebildim.

OpenGL deneyimi olmadan sadece programlama deneyimiyle başladım. Ray Wenderlich'in eğitim sitesini kullandım. Orada sağlanan bilgiler birinci sınıftır ve anlaşılması kolaydır. Gereksiz bilgilerin çoğunu inceler ve hızlı bir şekilde üretken olmak için bilmeniz gerekenleri sağlar. Bu öğreticiyi başlangıç ​​noktası olarak şiddetle tavsiye ediyorum: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Önereceğim diğer kaynak, Erik M Buck'ın iOS için Learning OpenGL ES başlıklı bir kitabı.

İOS için OpenGL ES kitap kapak resmi öğrenmek

Bazıları çok basit olduğunu söyleyerek eleştirdi. Ama tam olarak aradığım buydu. Tüm temel bilgileri anlamama yardımcı oldu ve daha gelişmiş şeyler öğrenmek için nereye gitmem gerektiğine dair bir fikir verdi. Ancak şaşırtıcı olmayan bir şekilde, Ray'in sitesinden ve Erik'in kitabından öğrendiğim basit teknikleri kullanarak artırılmış gerçeklik uygulamamı oluşturabildim. Her ikisine de paylaştıkları için teşekkürler !!!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.