Android OpenGL ES i 2D

Oto moja prośba. Nie znam już OpenGL i nie chcę się go nauczyć, chcę nauczyć się OpenGL ES bezpośrednio, ponieważ kieruję mój rozwój do Androida, jednak. Chcę nauczyć się OpenGL ES, aby rozwijać moje 2D gry. Wybrałem go dla celów wydajności (ponieważ podstawowe rysowanie SurfaceView nie jest tak skuteczne, 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 niektórych samouczków / przykładów mam znalezione gdziekolwiek, ale szczerze mówiąc, nie pomogło to wiele i jest to z dwóch powodów:

  1. prawie wszystkie artykuły/tutoriale, na które natknąłem się, są związane z 3D (chcę tylko nauczyć się rysować Sprity 2D)
  2. nie ma podstawy, od której można 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ć jakiś kod źródłowy (np.: Wyspa replik) ale kody też są skomplikowane i zawiera wiele rzeczy, które nie są konieczne; wynik: gubię się wśród 100 .pliki Javy z dziwnymi nazwami klas I takie tam.

Myślę, że nie ma takiego kursu jak ten, którego szukam, ale będę bardzo zadowolony, jeśli ktoś mógłby mi podać jakieś wytyczne i jakieś linki może dowiedzieć się, co robię (tylko OpenGL ES 2D Sprites rendering! nic 3D).

Author: Jeffrey Bosboom, 2010-08-24

6 answers

Byłem w podobnej sytuacji.
Sposób, w jaki zacząłem od openGL od początku, patrząc na bardzo podstawowe próbki/dema GLSurfaceView.

Rozpocznij, konfigurując aktywność w aplikacji i skonfiguruj podstawowe płótno.

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

Zobacz to pytanie, gdzie umieściłem swój własny kod: używając OpenGL do zastąpienia Canvas - Android

Po skonfigurowaniu canvas, zaczynasz od wywołania czegoś takiego jak: gl. glClear (GL10. GL_COLOR_BUFFER_BIT);

Po tym jesteś gotowy do renderowania sprite ' a. 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 spritów: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Tak 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 cię zachęcić do rysowania sprite ' ów 2D na kanwie OpenGL. Ja zauważyłem, że naprawdę nie ma prostego samouczka na ten temat. Mam nadzieję, że w przyszłości opublikuję jeden na moim blogu deweloperskim: http://developingthedream.blogspot.com/

 85
Author: Miguel Morales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:16:51

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

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

 12
Author: No one in particular,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 00:25:00

Na pewno bym checkout Android-Chris Pruett Google IO wykład Pisanie gier w czasie rzeczywistym dla Androida redux

Pobierz również plik PDF

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

Ale jeśli naprawdę skupiasz się na 2D to 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 do Androida, sam lubię i poziom programowania luv i jak dalej zaczniesz się rozwijać, dowiesz się dlaczego.

OpenGL : Sprawdź-Nehe Productions

Kilka aplikacji, które możesz umieścić w telefonie, które są tego warte i są darmowe jest: OpenGL Demo, min3d Framework, RedBook Sample

 3
Author: Atom Arcade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-05 21:14:56

Możesz zobaczyć projekt: https://github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md To implementuje canvas z OpenGL. To czysta Jawa. Implementuje części tego, co może zrobić normalne płótno.

 1
Author: ChillingVan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 06:36:43

Widzę, że wiele dobrych informacji zostało już dostarczonych. Chciałem udostępnić stronę, która pomogła szybko zorientować się w opengle! Zajęło to tylko kilka miesięcy i miało niestandardowy układ współrzędnych oparty na kartezjańskim układzie współrzędnych. Udało mi się renderować obiekt 3D bez kamery za pomocą technik Augmented Reality.

Zacząłem od doświadczenia w programowaniu, bez doświadczenia w OpenGL. Użyłem strony z tutorialami Raya Wenderlicha. Podane tam informacje są na najwyższym poziomie i łatwe do / align = "left" / Przecina większość zbędnych informacji i zapewnia to, co musisz wiedzieć, aby być produktywnym szybko. Gorąco polecam ten tutorial jako punkt wyjścia: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Innym zasobem, który polecam, jest książka Erika M Bucka, zatytułowana Learning OpenGL ES for iOS.

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

Niektórzy krytykowali go mówiąc, że jest zbyt uproszczony. Ale tego właśnie szukałem. To pomogło mi zrozumieć wszystkie podstawy i dał mi pomysł, gdzie powinienem iść dalej, aby dowiedzieć się bardziej zaawansowanych rzeczy. Ale nic dziwnego, że udało mi się zbudować aplikację rzeczywistości rozszerzonej przy użyciu prostych technik, których nauczyłem się ze strony Raya i książki Erika. Dziękujemy im obu za dzielenie się!!!

 0
Author: MikeyE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 06:31:28

Istnieje wiele samouczków online, które możesz śledzić, ale dla początkujących nic nie może zastąpić tego: prawdziwy Open GL ES 2.0 2D tutorial

 0
Author: ucMedia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-14 09:27:57