Конфигурация OpenGL ES

Чтобы отображать графику через OpenGL ES в вашем Android приложении, необходимо создать контейнер представлений. Одним из наиболее простых способов сделать это заключается в реализации GLSurfaceView и GLSurfaceView.Renderer GLSurfaceView представляет собой контейнер представлений для графики, отображаемой через OpenGL и GLSurfaceView.Renderer , который управляет тем, что отображается в этом представлении. Для получения дополнительной информации об этих классах см. OpenGL ES руководство разработчика.

GLSurfaceView лишь один из способов включения OpenGL ES графики в ваше приложение. Для полноэкранного или почти полноэкранного представления с графикой это разумный выбор. Разработчики, которые же хотят включить OpenGL ES графику в небольшой части своих макетов, должны взглянуть на TextureView. Для настоящих разработчиков, делающих всё вручную, также можно создать представление с OpenGL ES с помощью SurfaceView, но это требует написания совсем небольшого дополнительного кода.

Этот урок объясняет, как выполнить минимальную реализацию GLSurfaceView и GLSurfaceView.Renderer в простой деятельности приложения.

Объявление об использований OpenGL ES в манифесте

Чтобы ваше приложение могло использовать OpenGL ES 2.0 API, необходимо добавить следующее объявление в манифест:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

Если ваше приложение использует сжатие текстур, необходимо также объявить, какие Форматы сжатия вы поддерживаете, чтобы устройства, не поддерживающие эти форматы, даже не пытались запускать ваше приложение:

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

Для получения дополнительной информации о форматах сжатия текстур, см. OpenGL руководство разработчика.

Создание деятельности для OpenGL ES графики

Android приложения, которые используют OpenGL ES так же имеют деятельность, как любое другое приложение, которое имеет пользовательский интерфейс. Основное отличие от других приложений в том, что вы положили в макет вашей деятельности. В то время как во многих приложениях вы можете использовать TextView, Button и ListView, в приложение, которое использует OpenGL ES, вы также можете добавить GLSurfaceView.

В следующем примере кода показана минимальная реализация деятельности, которая использует GLSurfaceView в качестве основного представления:

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}

Примечание: OpenGL ES 2.0 требует Android 2.2 (API Уровень 8) или выше, поэтому убедитесь, что ваш Android проект ориентирован на этот уровень API или выше.

Создание GLSurfaceView объекта

GLSurfaceView это специализированное представление, в котором вы можете рисовать OpenGL ES графику. Само по себе оно не делает ничего особенного. Фактическое управление отрисовкой объектов в GLSurfaceView.Renderer , который вы установили для этого представления. На самом деле, код этого объекта настолько мал, что вы можете захотеть пропустить его расширение и просто создать немодифицированный GLSurfaceView экземпляр, но не делайте этого. Вы должны расширить этот класс, чтобы захватить сенсорные события, которые рассматриваются в уроке Реакция на события прикосновений.

Существенный код GLSurfaceView минимальный, поэтому для быстрой реализации, обычно просто создаётся внутренний класс в деятельности, которая его использует:

class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
        super(context);

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(new MyRenderer());
    }
}

При использовании OpenGL ES 2.0, необходимо добавить еще один вызов в ваш GLSurfaceView конструктор, указав, что вы хотите использовать 2.0 API:

// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);

Примечание: Если вы используете OpenGL ES 2.0 API, убедитесь, что вы объявили об этом в вашем манифесте приложения. Для получения дополнительной информации см. Объявление об использований OpenGL ES в манифесте.

Еще одно необязательное дополнением к вашей GLSurfaceView реализации это установка режима рендеринга представления, только когда есть изменения данных, с помощью GLSurfaceView.RENDERMODE_WHEN_DIRTY опции:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

Этот параметр предотвращает GLSurfaceView кадр от перерисовки до вызова requestRender(), , что является более эффективным для этого примера приложения.

Создание Renderer класса

Реализация GLSurfaceView.Renderer класса или визуализатора, в приложении, которое использует OpenGL ES, это то место, где вещи начинают становиться интересными. Этот класс управляет тем, что будет нарисовано в GLSurfaceView , с которым оно связано. Есть три метода визуализатора, которые вызываются системой Android для того, чтобы выяснить что и как рисовать на GLSurfaceView:

  • onSurfaceCreated() - Вызывается один раз для настройки среды выполнения OpenGL ES.
  • onDrawFrame() - Вызывается для каждой перерисовки представления.
  • onSurfaceChanged() - Вызывается, если изменилась геометрия представления, например, когда изменилась ориентация экрана устройства.

Вот очень простая реализация рендеринга на OpenGL ES, которая ничего особо не делает и только рисует серый фон в GLSurfaceView:

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

Вот и все, что нужно сделать! Примеры кода выше создали простое Android приложение, отображающее серый экран с помощью OpenGL. В то время как этот код не делает ничего очень интересного, создавая эти классы, вы заложили основу того, что нужно для начать отрисовки графических элементов на OpenGL.

Примечание: Вы можете удивиться, почему эти методы имеют GL10 параметр, когда вы используете OpengGL ES 2.0 API. Сигнатуры этих методов просто повторно используются для 2.0 API, чтобы упростить код Android платформы.

Если вы знакомы с OpenGL ES API, теперь вы должны быть в состоянии настроить среду OpenGL ES в вашем приложении, и начать рисовать графику. Тем не менее, если вам нужно немного больше помощи для начала работы с OpenGL, перейдите к следующим урокам для получения дополнительных советов.