Android OpenGL ES и 2D

96

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

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

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

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

CoolStraw
источник
33
and I'm not willing to learn itЭто не очень хороший способ начать вопрос здесь
Фалмарри
62
Пожалуйста, прочтите мой вопрос полностью, вы взяли из него одну деликатную часть и оставили самую важную завершение: «Я уже не знаю OpenGL и не хочу его изучать, я хочу изучать OpenGL ES напрямую, поскольку я ориентация моей разработки на Android "Какой смысл изучать OpenGL, если я собираюсь работать только с OpenGL ES на встроенных устройствах?" Cheers
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-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/

Мигель Моралес
источник
7
Чувак, большое тебе спасибо! Я никогда не получал таких маршрутов, это именно то, что я искал! И я буду следить за вашим блогом, надеюсь, вы предоставите нам отличные уроки в будущем :),
Еще раз
1
В той же ситуации, что и OP, и так же благодарен ему за ваш ответ. Удачи в вашей игре / блоге.
спасибо
1
Спасибо @Miguel Morales. Я устал искать 2D-чертежи с помощью GL. Как сказал CoolStraw, слишком много руководств с множеством ненужных вещей. Этот ответ был ясен, как кристалл.
Evren Ozturk
@Miguel Morales После долгих попыток я не могу ничего нарисовать, пока мои текстуры выглядят черными. Я задал вопрос stackoverflow.com/questions/9624260/… вы можете взглянуть?
Evren Ozturk
12

2D-программирование - это просто 3D-программирование, ограниченное плоскостью. У вас не будет выбора, кроме как изучить 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, мне нравится и уровень программирования luv, и по мере того, как вы начнете разработку, вы поймете, почему.

OpenGL: проверка - Nehe Productions

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

Атом Аркада
источник
0

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

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

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

Изучение OpenGL ES для обложки книги iOS

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

MikeyE
источник