OpenGL — это API для написания 2D и 3D графики, которая отображается на GPU. Это высвободит драгоценные вычислительные ресурсы на процессоре, которые будут использоваться для более сложной физики или большего количества объектов или чего-либо, не связанного с графикой.
Есть несколько понятий, которые необходимо понять, но я представлю их, когда мы столкнемся с ними в ходе курса.
Если вы следили за статьями, относящимися к отображению графики на устройстве Android, вы уже знаете, что для отображения графических элементов нам нужны поверхность и средство визуализации. Мы использовали базовый SurfaceView, из которого получили Canvas, и нарисовали на нем все, вызвав поддерживаемый метод draw из нашего игрового цикла.
Использование OpenGL мало чем отличается. Android поставляется с специальной реализацией интерфейса SurfaceView для отображения изображений, отображаемых OpenGL.
Давайте создадим проект Android обычным способом.
Я называю деятельность просто Run . Проверьте, что сгенерировал мастер, и он должен выглядеть так:
1
2
3
4
5
6
7
8
|
public class Run extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); } } |
Ничего особенного.
Создание рендерера OpenGL
Давайте построим рендерер. Создайте класс GlRenderer, который реализует интерфейс android.opengl.GLSurfaceView.Renderer .
Это будет выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView.Renderer; public class GlRenderer implements Renderer { @Override public void onDrawFrame(GL10 gl) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } } |
Нам необходимо реализовать вышеупомянутые 3 метода. В настоящее время они пусты и ничего не делают.
Методы
onSurfaceCreated (GL10 gl, EGLConfig config) создан или создан заново . Важно иметь в виду воссозданный бит, поскольку это означает, что каждый раз, когда устройство, например, засыпает и просыпается, поверхность воссоздается. Поскольку контекст, содержащий ресурсы, также разрушается, это место, где мы будем загружать наши ресурсы (изображения для текстур и т. Д.).
onSurfaceChanged (GL10 gl, int width, int height) вызывается всякий раз, когда изменяется размер поверхности. Это в основном влияет на нашу область просмотра. Окно просмотра — это просто прямоугольная область, через которую мы видим наш игровой мир.
onDrawFrame (GL10 gl) вызывается потоком рендеринга для рисования каждого кадра. Это где все рисование происходит. Нам не нужно называть это явно. Поток рендеринга создан для нас Android, и это будет называться.
Давайте переключимся на рендерер OpenGL. Проверьте новую активность Run .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package net.obviam.opengl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class Run extends Activity { /** The OpenGL view */ private GLSurfaceView glSurfaceView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); // requesting to turn the title OFF requestWindowFeature(Window.FEATURE_NO_TITLE); // making it full screen getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // Initiate the Open GL view and // create an instance with this activity glSurfaceView = new GLSurfaceView( this ); // set our renderer to be the main renderer with // the current activity context glSurfaceView.setRenderer( new GlRenderer()); setContentView(glSurfaceView); } /** Remember to resume the glSurface */ @Override protected void onResume() { super .onResume(); glSurfaceView.onResume(); } /** Also pause the glSurface */ @Override protected void onPause() { super .onPause(); glSurfaceView.onPause(); } } |
В строке 12 мы объявляем переменную-член GLSurfaceView . Это наш вид OpenGL, предоставленный Android. Когда мы создаем его экземпляр (строка 27 ), мы должны сделать его осведомленным о контексте. То есть для представления иметь доступ к среде приложения.
Все, что нам нужно сделать, это добавить наш рендерер в это представление. Это мы делаем в строке 31 .
В строке 32 указывается действие для использования нашего представления OpenGL.
Методы onResume () и onPause () переопределяются и запускают соответствующие методы в нашем представлении.
Вы можете запустить приложение как приложение для Android, и вы должны увидеть пустой черный экран.
Вот и все. Мы перешли с холста на рендерер OpenGL.
Загрузите исходный код и проект затмения здесь (obviam.opengl.p01.tgz)
Справка: OpenGL ES с учебником по Android — переход с Canvas на OpenGL от нашего партнера по JCG Тамаса Яно из блога « Против зерна ».
- Введение в разработку игр для Android Введение
- Разработка игр для Android — Идея игры
- Разработка игр для Android — Создать проект
- Разработка игр для Android — базовая игровая архитектура
- Разработка игр для Android — основной игровой цикл
- Разработка игр для Android — Отображение изображений с Android
- Разработка игр для Android — перемещение изображений на экране
- Разработка игр для Android — The Game Loop
- Разработка игр для Android — Измерение FPS
- Разработка игр для Android — Sprite Animation
- Разработка игр для Android — Particle Explosion
- Разработка игр для Android — Дизайн игровых объектов — Стратегия
- Разработка игр для Android — Использование растровых шрифтов
- Разработка игр для Android — отображение графических элементов (примитивов) с помощью OpenGL ES
- Разработка игр для Android — OpenGL Texture Mapping
- Разработка игр для Android — Дизайн игровых сущностей — Государственный паттерн
- Серия игр для Android