top of page

Тема 7.11. Изучаем OpenGL ES2 для Android

Данная статья написана для новичков, которые (как и я) хотят научиться писать программы для Андроид с использованием OpenGL. Основные мысли и код взяты из замечательной книги Кевина Бразалера «OpenGL ES 2 for Android. A Quick-Start Guide by Kevin Brothaler» (1).
Зачем же пересказывать, спросите вы? Дело в том, что перед этой книгой я прочитал еще десяток статей на эту тему и код Кевина у меня сразу не пошёл (в книге среда разработки Eclipse, а у меня Android Studio). Поэтому, решил написать эту статью так, чтобы было понятно, прежде всего, самому себе.
Для начала давайте выясним, что такое OpenGL. Если почитать Википедию (2), то увидим следующее:
«OpenGL (Open Graphics Library) — спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
Включает более 300 функций для рисования сложных трёхмерных сцен из простых примитивов. Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct3D.»
Мы будем изучать укороченную версию OpenGL ES 2 (в дальнейшем OpenGL). Укоротили её по понятным причинам, у Андроид малая операционная память по сравнению с настольными ПК, наличие виртуальной машины Java также накладывает определенные ограничения. Наверно есть еще много причин, почему это сделали, но нас это не должно волновать. Просто нужно знать, что есть прекрасный инструмент OpenGL и надо научиться им пользоваться!

Для начала у вас на компьютере должна быть установлена среда разработки Android Studio (3). Желательно к ней подключить реальное устройство, так как опыт показал, что эмуляторы плохо работают с OpenGL. В моем случае это будет планшет Samsung GT-P3113 Android 4.2.2, API 17.
Наша задача написать и запустить программу, которая будет циклично очищать экран и заливать его красным цветом с помощью средств OpenGL.

Шаг первый. Создание проекта.
1.1 Откройте Android Studio и создайте новый проект.

1.2. Выберите папку, где вы будете хранить проект и введите название приложения
First Open GL Project.

1.3. Выберите наименьшую версию устройства, на котором может работать ваше приложение. OpenGL ES2 поддерживается начиная с Android 2.3.3 (Gingerbread), таким образом, мы охватываем примерно 100% устройств на Google Play.

1.4. Выберите пустой бланк Активити. Назовите главное Активити FirstOpenGlProjectActivity, Лэйаут можно не создавать, но если решили создать, то назовите activity_first_open_glproject. Ждем некоторое время, пока идет сборка проекта.

Шаг второй. Запуск проекта
2.1 Запускаем проект на реальном устройстве.

2.2 Выберите для просмотра главное Активити и вместо того, что там сгенерировалось автоматически, вставьте следующий код. В дальнейшем мы разберем построчно, что он делает.

package com.adc2017gmail.firstopenglproject;

 

import android.app.Activity;

import android.app.ActivityManager;

import android.content.Context;

import android.content.pm.ConfigurationInfo;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

import android.widget.Toast;

 

public class FirstOpenGLProjectActivity extends Activity {

    private GLSurfaceView glSurfaceView;

    private boolean rendererSet = false;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        glSurfaceView = new GLSurfaceView(this);

 

        // Проверяем поддерживается ли OpenGL ES 2.0.

        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();

        final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

        if (supportsEs2) {

// Request an OpenGL ES 2.0 compatible context. glSurfaceView.setEGLContextClientVersion(2);

// Assign our renderer.

            glSurfaceView.setRenderer(new FirstOpenGLProjectRenderer()); rendererSet = true;

        } else {

            Toast.makeText(this, "This device does not support OpenGL ES 2.0.", Toast.LENGTH_LONG).show(); return;

        }

 

        setContentView(glSurfaceView);

 

    }

 

    @Override

    protected void onPause() { super.onPause();

        if (rendererSet) {

            glSurfaceView.onPause();

        }

    }

    @Override

    protected void onResume() { super.onResume();

        if (rendererSet) {

            glSurfaceView.onResume();

        }

    }

 

}

bottom of page