OpenGL ES 1.1 и 2.0 для разработки iPhone игр

22
OpenGL ES 1.1 и 2.0 для разработки iPhone игр Товченко Тарас [email protected]

description

Доклад Тараса Товченко на iPhoneDevCamp Kyiv 21 ноября

Transcript of OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Page 1: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Товченко Тарас [email protected]

Page 2: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

OpenGL - реализует API для передачи графических данных на устройство для визуализации и

последующего вивода этих данных на экран

OpenGL OpenGL APIAPI

OpenGL OpenGL APIAPI

User User CodeCodeUser User CodeCode

данные и

комманды

визуализация ивывод

Page 3: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Основные объекты-понятия в OpenGLES API (краткое описание)

•Текстуры

•Буфера (VBO)

•Шейдеры

•Рендер-буфера

•Фрейм-буфер (FBO)

•Контекст

Page 4: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Единый контекст

2222

Render contextViewTexture Texture

11Texture Texture

11Texture Texture

22Texture Texture

22

Texture Texture 33

Texture Texture 33

VBO 1VBO 1VBO 1VBO 1

VBO 2VBO 2VBO 2VBO 2

ShaderShaderShaderShader

Current

Need bind

11Плохая

практика

Page 5: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Производительность

•При создании OpenGL View нужно задавать ей размеры всего экрана iPhone и не использовать каких-то других view.

•Не нужно создавать несколько контекстов рисования. Для этой цели можно создать один контекст и несколько FBO для него.

Page 6: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Framebuffers

•Реализуется с помощью расшерения OES_framebuffer_object

Page 7: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Hardware реализация OpenGLES на iPhone

•UIView содержит внутри себя систему из CoreAnimation слоев (CALayer).

•UIView которая имеет CAEAGLLayer называется EAGLView и может быть использована в качестве источника получения данных и комманд OpenGL

Page 8: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

+ (Class) layerClass { return [CAEAGLLayer class];}

myEAGLLayer = (CAEAGLLayer*)self.layer;

GLuint framebuffer;glGenFramebuffersOES(1, &framebuffer);glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

GLuint colorRenderbuffer;glGenRenderbuffersOES(1, &colorRenderbuffer);glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);[myContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:myEAGLLayer];glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

Page 9: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Отличия OpenGL ES 1.1 и 2.0

Точка выбора версии OpenGL ES

EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];[EAGLContext setCurrentContext: myContext];

GLES 1.1 - реализует набор стандартных ф-й для вивода всей графической информации, в том числе и для затенения.GLES 2.0 - реализует набор ф-й для инициализации, управления состояниями контекста и вывода VBO c текстурами, все остальные операции (модификация вершин, затенение и т.п.) реализуются через шейдеры.

Page 10: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

ШейдерыOpenGL ES 2.0 поддерживает:

1. Pixel Shaders (Fragment) - программа которая исполняется на видео карточке для каждого пикселя.

2. Vertex Shaders - тоже самое только вызывается для каждой вершины модели.

Таким образом все операции по обработке вершин и пикселей можно писать на шейдерах и не тратить на них процессорное время. Это дает больше возможностей для реализации техник затенений.

Page 11: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

OpenGL Shader Builder от Apple

Page 12: OpenGL ES 1.1 и 2.0 для разработки iPhone игр
Page 13: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Рекомендации, часто используемые техники,различные улучшения

Page 14: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Модели и VBOКак лучше:

1. Создавать для каждого объекта свой VBO, слить один раз данные, при условии что они не меняются, а потом при отрисовке перебирать все VBO и выводить?

2. Создать один VBO и каждый раз при отрисовке перебирать все объекты и заливать в него данные при этом не тратя время на переключение между буферами?

Page 15: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

РешениеСоздаем один VBO, затем сливаем в него данные от всех объектов при этом пересчитываем индексы.

object object 11

object object 22

object object 33

vert: x0,y0,z0-x1... vert: x0,y0,z0-x1... vert: x0,y0,z0-x1...index: 0,2,1,3

index: 0,1,2

index: 2,1,3,0

index vboindex vbo

0,2,1,3, - 4,5,6, - 9,8,10,7

Page 16: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Правильная последовательность биндинга

OpenGL объектов - залог производительности

Очень важно во время рендеринга чем по менше использовать операции переключения текущего объекта (например текстуры) или изменения состояния opengl. Для этого нужно иметь так называемый дрокол вывода данных (drawing protocol), который представляет из себя отсортированный список объектов по состояниям отрисовки. Под состояниями понимается: 1. состояния самого opengl 2. текущая текстура 3. трансформации 4. и могут быть какие-то еще свои костомные атрибуты

Page 17: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

ПримерЕсть 3 объекта и 2

текстуры

object object 11

object object 22

object object 33

tex 1tex 1

tex 2tex 2

tex 1tex 1

object object 11

object object 22

object object 33

tex 1tex 1

tex 2tex 2

tex 1tex 1

Неправильно Правильно

Page 18: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Повышение производительности для статической геометрии

•На iPhone лучше всего из всей статической геометрии которая есть на сцене предварительно создать один меш и уже затем его рендерить, если конечно это возможно. Делается для того что бы с помощью одного трансформа отрисовать все статические объекты (за один вызов glDrawElements).

Page 19: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Экспорт 3D объектов из графических редакторов

Maya 3DMax Для этой цели проще всего использовать формат OBJ в который умеет экпортировать почти любой 3D-редактор и который очень простой для парсинга и последующего извлечения данных. Но перед использованием данного формата в своем iPhone приложении его следует предварительно обработать.

Page 20: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

OBJ - формат

Является текстовым форматом в котором интересующие нас данные представлены в следующем виде:v 0.617428 -0.168873 -1.800043v 0.664162 0.002637 1.938868v 0.792035 -0.168873 -1.800043

vn -0.423596 -0.905671 0.018061vn -0.399840 -0.916549 -0.008100vn 0.403383 -0.915026 -0.003040

vt 0.520304 0.236667vt 0.662630 0.236373vt 0.662631 0.374176

f 0/2/5 4/3/0 2/0/1f 8/3/2 2/3/4 4/6/7f 1/4/7 2/3/8 2/9/3

Page 21: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

iPhone приложения не должны тратить свое время на парсинг текста и построения правильной последовательности вершин и индексов, эта работа должна быть предварительно выполнена парсером.vertex data: x0, y0, z0, u0, v0, xn0,

yn0, zn0, ...index data: 0, 4, 5, 3, 2, 3, 0, 1... Для удобства можно сделать что бы

парсер результат своей работы сохранял в apple plist, в котором будут лежать уже правильно построенные бинарные данные в str-закодированном виде. И потом загружаем этот plist в NSDictionary и по имени тега получаем данные объекта.

Page 22: OpenGL ES 1.1 и 2.0 для разработки iPhone игр

Спасибо за вниманиеи

удачных проектов :)

Taras (DoctorSet) Tovchenko

2009