Android OpenGL ES и 2D

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

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

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

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

Ответ 1

Я был в похожей ситуации.
То, как я начинал с 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. Я заметил, что на самом деле нет простого учебника по этому вопросу. Надеюсь, в будущем я отправлю сообщение в своем блоге dev: http://developingthedream.blogspot.com/

Ответ 2

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

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

Ответ 3

Я бы определенно проверил Android - Chris Pruett Google IO lecture Написание игр в режиме реального времени для 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

Ответ 5

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

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

Другим ресурсом, который я бы рекомендовал, является книга Эрика М Бака, озаглавленная Learning OpenGL ES для iOS.

Learning OpenGL ES for iOS book cover art

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