Чтобы рисовать графику с помощью 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, перейдите к следующим урокам, чтобы получить еще несколько подсказок.