Создание среды OpenGL ES

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

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

В уроке поясняется как создать минимальную реализацию GLSurfaceView и GLSurfaceView.Renderer в простом явлении.

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

Для использования OpenGL ES 2.0 в приложении, вы должны добавить следующие строки в файл манифеста:

Если в вашем приложении используется компрессия текстур, вы должны также объявить форматы компрессии, которые оно поддерживает. Тогда приложение сможет быть установлено только на совместимые устройства:

Подробную информацию о форматах компрессии текстур смотрите в разделе OpenGL.

Создаем явление для графики OpenGL ES

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

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

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

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

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

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

Если вы используете OpenGL ES 2.0, вы должны добавить другой вызов конструктора GLSurfaceView, показывающий, что вы хотите использовать API версии 2.0:

Примечание:Если вы используете OpenGL ES 2.0, убедитесь, что вы указали это в файле манифеста, как это показано в предыдущем разделе текущего урока.

При использовании дополнительной опции GLSurfaceView.RENDERMODE_WHEN_DIRTY для GLSurfaceView, прорисовка в контейнере происходит только при изменении данных:

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

Создаем класс Renderer

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

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

Далее приведена базовая реализация Renderer, которая только отрисовывает серый прямоугольник заднего фона в контейнере:

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

Примечание: не переживайте, что используются методы с параметром GL10, в то время, как мы используем OpenGL ES 2.0. Прототипы данных методов также используются в OpenGL ES 2.0, чтобы сохранить код фреймворка простым.

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

Добавить комментарий