SORU
24 AĞUSTOS 2010, Salı


Android OpenGL ES ve 2D

İşte benim istek. Zaten OpenGL bilmiyorum, ve öğrenmek için istekli değilim, android etmek benim için bir gelişme, ancak hedef olduğum için OpenGL ES doğrudan öğrenmek istiyorum. Benim geliştirmek için OpenGL ES öğrenmek istiyorum2Doyunlar. Performansları amaç temel çizim SurfaceView RT oyunlara gelince verimli olmadığı için bunu seçtim. Nerede başlar?benim sorum: Bir ay boyunca bazı dersler buldum örnekler her yerde/çalışıyor/Google ve okuma gezen ama dürüst olmak gerekirse geçirdim, çok da yardımcı olmadı ve bu iki nedeni vardır:

  1. Neredeysetümmakaleler 3D ile ilgili rastladım oldum/(sadece 2D Sprite benim çizim yapmayı öğrenmek istiyorum) öğreticiler
  2. Tüm makaleler özel bir şey gibi hedefleri bu yana başlamak için temel var: Bir üçgenin köşeleri ile) çizmek için Nasıl"", bir Kafes oluşturmak için Nasıl ""... vb.

Bazı kaynak kodu okumayı çok denedim (ör.: ama kodları çok karmaşık ve gerekli olmayan şeyler bir sürü içerir kopya Adası); sonuç: 100 arasında kayboluyorum .java garip sınıf adları ve malzeme ile dosyaları.

Aradığım gibi bir ders yok sanırım, ama eğer biri bana bazı kurallar ve bazı verebilir eğer çok memnun olurumbağlantılarbelki de (OpenGL ES 2D Sprite sadece render! ben ne olduğunu öğrenmek için hiçbir şey) 3D.

CEVAP
5 EYLÜL 2010, Pazar


Benzer bir durumda kalmıştım.
Çok temel GLSurfaceView bakarak başlamak ile openGL ile başladım şekilde numuneler/demolar.

Uygulama etkinliği ayarlayarak başlangıç ve temel tuval ayarlayın.

Kopya ısland kaynak kod dosyası bir ganimet almak: 2B (sprite) işleme için uygun GL bayrakları ile tuval kurulumu nasıl GameRenderer.java . Gerçekten de SpriteMethodTest kopya adanın aynı yazar tarafından bakmak gerekir: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Kendi kodumu yazdım nerede bu soruya bakın: Using OpenGL to replace Canvas - Android

Branda ayarladıktan sonra, bir şey gibi çağırarak başlatın: gl.glClear(GL10.GL_COLOR_BUFFER_BİT);

Bundan sonra bir sprite işlemek için hazırsınız. İlk olarak, bir doku içine sprite yüklemek için ihtiyacınız olacak: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Ancak, bu gerçekten bana yükleme Sprite ile yardımcı öğretici: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Bu işi böyle yapıyorum, bir sınıfı texture.java adında 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;
 }
}

O zaman benim onDrawFrame() sadece yaparım yöntem:

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 openGL bir tuval üzerinde 2D Sprite çizim ile. Bu olaya çok basit bir öğretici olduğunu hiç fark ettik. Dev blogumda bir yazı olacak umarım gelecekte: http://developingthedream.blogspot.com/

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • ibebrent

    ibebrent

    23 Temmuz 2007
  • National Geographic

    National Geo

    7 Mayıs 2006