Android OpenGL ES та 2D


95

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

  1. Майже всі статті / підручники, з якими я стикався, пов'язані з 3D (я хочу лише навчитися робити свій 2D-спрайт-малюнок)
  2. Немає основи для початку, оскільки всі статті націлені на конкретні речі, такі як: "Як намалювати трикутник (з вершинами)", "Як створити сітку" ... тощо.

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

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


33
and I'm not willing to learn itЦе не дуже хороший спосіб почати запитання тут
Фальмаррі

62
Будь ласка, прочитайте моє ціле запитання, ви взяли одну чутливу його частину і залишили найголовніше завершення: "Я ще не знаю OpenGL, і я не хочу його вивчати, я хочу навчитися OpenGL ES безпосередньо, оскільки я націлюючи свою розробку на android "Який сенс вивчати OpenGL, якщо я збираюся працювати лише з OpenGL ES на вбудованих пристроях? Привітання
CoolStraw

5
Враховуючи, що OpenGL ES - це переважно підмножина OpenGL, я не бачу сенсу стверджувати, що ви не збираєтесь вивчати OpenGL, оскільки за визначенням вам доведеться це зробити.
dash-tom-bang

2
До речі - Острів реплік - це майже те місце, де можна подивитися. Ви можете почати з цього і почати із внесення змін до нього. Зачистіть речі, які вам не потрібні чи потрібні, і тоді 100 класів стає 99, потім 98, потім 97 ...
dash-tom-bang

Відповіді:


85

Я був у подібній ситуації.
Спосіб, яким я розпочав роботу з 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-texture-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/


7
Чувак дуже дякую! Я ніколи не отримував таких напрямків, це саме те, що я шукав! І я буду стежити за вашим блогом, сподіваюся, ви надасте нам чудові підручники в майбутньому :), Ще раз велике спасибі
CoolStraw

1
У тій же ситуації, що і ОП, і такий же вдячний, як він, за вашу відповідь. Удачі вам у вашій грі / блозі. thx знову
unR

1
Дякую @ Мігель Моралес Мені набридло шукати 2D-малюнок за допомогою GL. Як сказав CoolStraw, в ньому занадто багато підручників з безліччю непотрібних речей. Ця відповідь була чіткою, як кристал.
Еврен Озтюрк

@ Мігель Моралес Після багатьох спроб я не можу нічого намалювати, це мої текстури виглядають чорними. Я задав запитання stackoverflow.com/questions/9624260/ ... чи можете ви поглянути?
Еврен Озтюрк

12

Двовимірне програмування - це просто тривимірне програмування, обмежене площиною. Вам не залишиться нічого іншого, як вивчити 3D, але коли ви використовуєте його, просто встановіть z = 0.

Існує офіційна книга про OpenGL ES. Це може дати вам вступ, який ви шукаєте: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


8
Щоб бути педантичним, ви все ще використовуєте Z, щоб дозволити апаратному забезпеченню робити сортування за вас. Велика зміна полягає в тому, що (ймовірно) 2D-програма використовуватиме орфографічний вигляд замість перспективного.
dash-tom-bang

Щиро дякую за вашу відповідь, ваша заява показує мені, що я помилився щодо визначення Opengl та Opengl ES.
CoolStraw

3

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

також захопіть PDF

це дійсно корисно на багатьох рівнях, Кріс має справді великий досвід створення ігор для мобільних пристроїв

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

Інший варіант залежить від рівня кваліфікації - це Flash + AdobeAIR для Android, мені самому подобається та люблю рівень програмування, і коли ви почнете розроблятись, ви дізнаєтесь, чому.

OpenGL: Перевірте - Nehe Productions

кілька додатків, які ви можете захотіти поставити на свій телефон, і вони безкоштовні: це демонстрація OpenGL, min3d Framework, зразок RedBook



0

Я бачу, що багато хорошої інформації вже було надано. Я хотів поділитися сайтом, який допоміг швидко пришвидшити роботу на OpenGLE! Це зайняло лише кілька місяців, і ми створили власну систему координат, засновану на декартовій системі координат. Мені вдалося відтворити 3D-об'єкт без камери, використовуючи методи доповненої реальності.

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

Іншим ресурсом, який я рекомендую, є книга Еріка М. Бака під назвою Learning OpenGL ES для iOS.

Вивчення OpenGL ES для обкладинки книг iOS

Деякі критикували його, кажучи, що це занадто спрощено. Але це саме те, що я шукав. Це допомогло мені зрозуміти всі основи та дало мені уявлення про те, куди мені йти далі, щоб дізнатись про більш досконалі речі. Але не дивно, що я зміг створити свій додаток з доповненою реальністю, використовуючи прості прийоми, про які я дізнався на сайті Рея та книзі Еріка. Дякую їм обом за обмін !!!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.