Создайте среду 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 в манифесте.

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

<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 в качестве основного представления:

Котлин

class OpenGLES20Activity : Activity() {

    private lateinit var gLView: GLSurfaceView

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

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

Ява

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView gLView;

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

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

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

Создайте объект GLSurfaceView.

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

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

Котлин

import android.content.Context
import android.opengl.GLSurfaceView

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    private val renderer: MyGLRenderer

    init {

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

        renderer = MyGLRenderer()

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer)
    }
}

Ява

import android.content.Context;
import android.opengl.GLSurfaceView;

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer renderer;

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

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

        renderer = new MyGLRenderer();

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

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

Котлин

// Render the view only when there is a change in the drawing data
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

Ява

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

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

Создайте класс рендеринга

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

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

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

Котлин

import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

import android.opengl.GLES20
import android.opengl.GLSurfaceView

class MyGLRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
    }

    override fun onDrawFrame(unused: GL10) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    }

    override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }
}

Ява

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.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 , когда вы используете API OpengGL ES 2.0. Эти сигнатуры методов просто повторно используются в API версии 2.0, чтобы упростить код платформы Android.

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