Android OpenGL ES i 2D

96

Cóż, oto moja prośba. Nie znam jeszcze OpenGL i nie chcę się go uczyć, chcę się uczyć OpenGL ES bezpośrednio, ponieważ jednak moje programowanie jest przeznaczone dla Androida. Chcę się uczyć OpenGL ES, aby tworzyć moje gry 2D . Wybrałem go ze względu na wydajność (ponieważ podstawowy rysunek SurfaceView nie jest tak wydajny, jeśli chodzi o gry RT). Moje pytanie brzmi: od czego zacząć? Spędziłem ponad miesiąc przeglądając Google i czytając / próbując kilku samouczków / przykładów, które znalazłem gdziekolwiek, ale szczerze mówiąc, niewiele to pomogło, a dzieje się tak z dwóch powodów:

  1. Prawie wszystkie artykuły / samouczki, z którymi się spotkałem, są związane z 3D (chcę się tylko nauczyć, jak rysować moje sprite'y 2D)
  2. Nie ma żadnej podstawy, od której można by zacząć, ponieważ wszystkie artykuły dotyczą konkretnych rzeczy, takich jak: „Jak narysować trójkąt (z wierzchołkami)”, „Jak utworzyć siatkę” ... itd.

Próbowałem też przeczytać kod źródłowy (np. Wyspa repliki), ale kody są zbyt skomplikowane i zawierają wiele rzeczy, które nie są potrzebne; wynik: gubię się wśród 100 plików .java z dziwnymi nazwami klas i innymi rzeczami.

Wydaje mi się, że nie ma takiego kursu jak ten, którego szukam, ale byłbym bardzo zadowolony, gdyby ktoś dał mi kilka wskazówek i może kilka linków, aby dowiedzieć się, co robię (tylko renderowanie duszków 2D OpenGL ES! Nic 3D ).

CoolStraw
źródło
33
and I'm not willing to learn itTo nie jest dobry sposób na rozpoczęcie tutaj pytania
Falmarri
62
Proszę przeczytaj całe moje pytanie, wziąłeś jedną wrażliwą część i zostawiłeś najważniejsze uzupełnienie: „Nie znam jeszcze OpenGL i nie chcę się go uczyć, chcę się uczyć OpenGL ES bezpośrednio, ponieważ jestem ukierunkowanie mojego rozwoju na Androida „Po co uczyć się OpenGL, jeśli zamierzam pracować tylko z OpenGL ES na urządzeniach wbudowanych? Pozdrawiam
CoolStraw
5
Biorąc pod uwagę, że OpenGL ES jest głównie podzbiorem OpenGL, nie widzę sensu mówienia, że ​​nie zamierzasz się uczyć OpenGL, ponieważ z definicji będziesz musiał.
dash-tom-bang
2
BTW - Replica Island to prawie miejsce do obejrzenia. Możesz zacząć od tego i zacząć od wprowadzenia zmian. Pozbądź się rzeczy, których nie chcesz lub nie potrzebujesz, a potem 100 klas zamieni się w 99, potem 98, a potem 97 ...
dash-tom-bang

Odpowiedzi:

85

Byłem w podobnej sytuacji.
Sposób, w jaki zacząłem z openGL od początku, od spojrzenia na bardzo podstawowe przykłady / dema GLSurfaceView.

Zacznij od skonfigurowania aktywności w aplikacji i podstawowej kanwy.

Zdobądź łup w pliku kodu źródłowego wyspy repliki: GameRenderer.java, aby dowiedzieć się, jak skonfigurować płótno z odpowiednimi flagami GL do renderowania 2D (sprite). Naprawdę powinieneś rzucić okiem na SpriteMethodTest tego samego autora repliki wyspy: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Zobacz to pytanie, w którym opublikowałem własny kod: Używanie OpenGL do zastąpienia Canvas - Android

Po skonfigurowaniu płótna zacznij od wywołania czegoś takiego: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Następnie jesteś gotowy do renderowania duszka. Najpierw musisz załadować sprite'a do tekstury: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Jednak jest to samouczek, który naprawdę pomógł mi w ładowaniu sprite'ów: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Oto jak to robię, mam klasę o nazwie 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;
 }
}

Następnie w mojej metodzie onDrawFrame () po prostu robię:

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

To powinno sprawić, że zaczniesz rysować sprite'y 2D na płótnie openGL. Zauważyłem, że nie ma na ten temat prostego samouczka. Mam nadzieję, że w przyszłości opublikuję jeden na swoim blogu deweloperów: http://developingthedream.blogspot.com/

Miguel Morales
źródło
7
Koleś bardzo ci dziękuję! Nigdy nie miałem takich wskazówek, właśnie tego szukałem! Będę
pilnował
1
W tej samej sytuacji co OP i równie wdzięczny jak on za odpowiedź. Powodzenia w Twojej grze / blogu. thx ponownie
unR
1
Dziękuję @Miguel Morales. Byłem zmęczony szukaniem rysunków 2D w GL. Jak powiedział CoolStraw, jest za dużo samouczków z mnóstwem niepotrzebnych rzeczy. Ta odpowiedź była jasna jak kryształ.
Evren Ozturk
@Miguel Morales Po wielu próbach nie mogę nic narysować, ponieważ moje tekstury są czarne. Zadałem pytanie stackoverflow.com/questions/9624260/ ... możesz rzucić okiem?
Evren Ozturk
12

Programowanie 2D to po prostu programowanie 3D, które jest ograniczone do płaszczyzny. Nie będziesz miał innego wyboru, jak nauczyć się 3D, ale kiedy go używasz, po prostu ustaw z = 0.

Istnieje oficjalna książka o OpenGL ES. To może dać ci wprowadzenie, którego szukasz: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

Nikogo w szczególności
źródło
8
Aby być pedantycznym, nadal używasz Z, abyś mógł pozwolić sprzętowi na sortowanie. Duża zmiana polega na tym, że (prawdopodobnie) aplikacja 2D będzie używać widoku ortograficznego zamiast perspektywicznego.
dash-tom-bang
Bardzo dziękuję za odpowiedź, z twojego oświadczenia wynika, że ​​myliłem się co do definicji Opengl i Opengl ES.
CoolStraw
3

Na pewno kupiłbym Androida - wykład Chrisa Pruetta Google IO Pisanie gier czasu rzeczywistego na Androida

pobierz również plik PDF

jest bardzo pomocny na wielu poziomach, Chris ma naprawdę duże doświadczenie w tworzeniu gier na urządzenia mobilne

ale jeśli naprawdę koncentrujesz się na 2D, zacznij od Canvas http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Inną opcją zależną od poziomu umiejętności jest Flash + AdobeAIR na Androida, ja sam lubię i lubię poziom programowania, a gdy będziesz dalej rozwijać się, dowiesz się dlaczego.

OpenGL: Sprawdź - Nehe Productions

kilka aplikacji, które możesz chcieć zainstalować na swoim telefonie, które są tego warte i są darmowe to: OpenGL Demo, min3d Framework, RedBook Sample

Atom Arcade
źródło
0

Widzę, że podano już wiele dobrych informacji. Chciałem udostępnić witrynę, która pomogła szybko przyspieszyć działanie OpenGLE! Zajęło to tylko kilka miesięcy i miał niestandardowy układ współrzędnych oparty na układzie współrzędnych kartezjańskich. Udało mi się renderować obiekt 3D bez kamery przy użyciu technik rozszerzonej rzeczywistości.

Zacząłem od samego doświadczenia w programowaniu, bez doświadczenia w OpenGL. Skorzystałem ze strony z samouczkami Raya Wenderlicha. Podane tam informacje są na najwyższym poziomie i łatwe do zrozumienia. Przekracza większość zbędnych informacji i podaje to, czego potrzebujesz, aby szybko osiągnąć produktywność. Bardzo polecam ten samouczek jako punkt wyjścia: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Innym źródłem, które polecam, jest książka Erika M. Bucka zatytułowana Learning OpenGL ES for iOS.

Nauka okładki książki OpenGL ES dla iOS

Niektórzy krytykowali to, mówiąc, że jest zbyt uproszczony. Ale właśnie tego szukałem. Pomogło mi to zrozumieć wszystkie podstawy i dało mi pomysł, gdzie powinienem się udać, aby nauczyć się bardziej zaawansowanych rzeczy. Ale nic dziwnego, że udało mi się zbudować aplikację rozszerzonej rzeczywistości przy użyciu prostych technik, których nauczyłem się na stronie Raya i w książce Erika. Dziękuję im obu za udostępnienie !!!

MikeyE
źródło