Android OpenGL ES и 2D - PullRequest
       7

Android OpenGL ES и 2D

93 голосов
/ 24 августа 2010

Ну, вот моя просьба.Я еще не знаю OpenGL, и я не желаю изучать его, я хочу изучать OpenGL ES напрямую, так как я нацеливаю свою разработку на Android, однако.Я хочу изучать OpenGL ES, чтобы разрабатывать мои 2D игры.Я выбрал его для целей исполнения (поскольку базовый чертеж SurfaceView не так эффективен, когда речь идет о RT-играх).У меня вопрос: с чего начать?Я провел более месяца, просматривая Google и читая / пробуя некоторые учебники / примеры, которые я нашел где угодно, но, честно говоря, это не очень помогло, и это по двум причинам:

  1. Почти все статьи / учебники, с которыми я столкнулся, связаны с 3D (я только хочу научиться делать мой 2D-рисунок со спрайтами)
  2. Нет оснований для начала, так как все статьи нацеленыконкретные вещи, такие как: «Как нарисовать треугольник (с вершинами)», «Как создать сетку» ... и т. д.

Я тоже пытался прочитать некоторый исходный код (например,.: остров реплики) но коды слишком сложны и содержат много ненужного;результат: я теряюсь среди 100 файлов .java со странными именами классов и прочим.

Я думаю, что нет такого курса, как тот, который я ищу, но я буду очень рад, если кто-нибудь даст мне немногорекомендации и некоторые ссылки возможно, чтобы узнать, что я собираюсь сделать (только рендеринг спрайтов OpenGL ES 2D! ничего 3D).

Ответы [ 6 ]

85 голосов
/ 06 сентября 2010

Я был в похожей ситуации.
То, как я начал с openGL с самого начала, рассматривая самые базовые примеры / демонстрации GLSurfaceView.

Начните с настройки активности вашего приложения и настройки базового холста.

Посмотрите на файл исходного кода острова реплики: GameRenderer.java, чтобы узнать, как настроить холст с помощьюправильные флаги GL для 2D (спрайт) рендеринга.Вы действительно должны взглянуть на SpriteMethodTest того же автора острова реплики: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

См. Этот вопрос, где я разместил свой собственный код: Использование OpenGL для замены Canvas - Android

После того, как вы настроили свой холст, вы начинаете с вызова чего-то вроде: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

После этого вы готовы визуализировать спрайт.Во-первых, вам нужно загрузить спрайт в текстуру: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Однако этот урок действительно помог мне с загрузкой спрайтов: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Вот какЯ делаю это, у меня есть класс с именем 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;
 }
}

Затем в моем методе onDrawFrame () я просто делаю:

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

Это должно помочь вам начать рисовать 2Dспрайты на холсте openGL.Я заметил, что на самом деле нет простого учебника по этому вопросу.Надеюсь, в будущем я опубликую его в своем блоге для разработчиков: http://developingthedream.blogspot.com/

12 голосов
/ 25 августа 2010

2D-программирование - это просто 3D-программирование, ограниченное плоскостью.У вас не будет другого выбора, кроме как изучать 3D, но когда вы используете его, просто установите z = 0.

Существует официальная книга по OpenGL ES.Это может дать вам вступление, которое вы ищете: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

3 голосов
/ 06 сентября 2010

Я бы определенно заказал Android - Крис Пруетт, Google IO лекция Написание игр в реальном времени для Android redux

также захватите PDF

это действительно полезно на многих уровнях, у Криса действительно большой опыт в создании игр для мобильных устройств

но если вы действительно сосредоточены на 2D, начните с Canvas http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Еще один вариант зависит от уровня квалификации: Flash + AdobeAIR для Android, мне самому нравится уровень программирования luv, и по мере дальнейшего развития вы поймете, почему.

OpenGL: Проверить - Nehe Productions

пара приложений, которые вы можете установить на свой телефон, стоит того, и они бесплатны: OpenGL Demo, min3d Framework, Образец RedBook

1 голос
/ 19 июня 2017

Вы можете увидеть проект : https://github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md Это реализует холст с OpenGL. Это чистая Java. Он реализует части того, что может делать обычный холст.

0 голосов
/ 14 апреля 2018

Существует множество онлайн-учебников, которым вы можете следовать, но для новичка ничто не заменит этого: Настоящий учебник Open GL ES 2.0 2D

0 голосов
/ 07 мая 2015

Я вижу много полезной информации уже предоставлено. Я хотел поделиться сайтом, который помог быстро освоиться с OpenGLE! Это заняло всего несколько месяцев и имело собственную систему координат, основанную на декартовой системе координат. Я был в состоянии визуализировать 3D-объект без камеры, используя методы дополненной реальности.

Я начал с опыта программирования, но без опыта OpenGL. Я использовал сайт учебников Рэя Вендерлиха. Информация, представленная там, на высшем уровне и легко понять. Он прорезает большую часть лишней информации и предоставляет то, что вам нужно знать, чтобы быстро работать. Я очень рекомендую этот урок в качестве отправной точки: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Другой ресурс, который я бы порекомендовал, - это книга Эрика М. Бака под названием «Изучение OpenGL ES для iOS».

Learning OpenGL ES for iOS book cover art

Некоторые критиковали это, говоря, что это слишком упрощенно. Но это именно то, что я искал. Это помогло мне понять все основы и дало мне представление о том, куда мне следует идти дальше, чтобы изучить более продвинутые вещи. Но неудивительно, что я смог создать свое приложение с дополненной реальностью, используя простые приемы, которые я изучил на сайте Рэя и в книге Эрика. Спасибо им обоим за то, что поделились !!!

...