![Page 2: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/2.jpg)
OpenGL - реализует API для передачи графических данных на устройство для визуализации и
последующего вивода этих данных на экран
OpenGL OpenGL APIAPI
OpenGL OpenGL APIAPI
User User CodeCodeUser User CodeCode
данные и
комманды
визуализация ивывод
![Page 3: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/3.jpg)
Основные объекты-понятия в OpenGLES API (краткое описание)
•Текстуры
•Буфера (VBO)
•Шейдеры
•Рендер-буфера
•Фрейм-буфер (FBO)
•Контекст
![Page 4: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/4.jpg)
Единый контекст
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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/5.jpg)
Производительность
•При создании OpenGL View нужно задавать ей размеры всего экрана iPhone и не использовать каких-то других view.
•Не нужно создавать несколько контекстов рисования. Для этой цели можно создать один контекст и несколько FBO для него.
![Page 6: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/6.jpg)
Framebuffers
•Реализуется с помощью расшерения OES_framebuffer_object
![Page 7: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/7.jpg)
Hardware реализация OpenGLES на iPhone
•UIView содержит внутри себя систему из CoreAnimation слоев (CALayer).
•UIView которая имеет CAEAGLLayer называется EAGLView и может быть использована в качестве источника получения данных и комманд OpenGL
![Page 8: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/8.jpg)
+ (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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/9.jpg)
Отличия 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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/10.jpg)
ШейдерыOpenGL ES 2.0 поддерживает:
1. Pixel Shaders (Fragment) - программа которая исполняется на видео карточке для каждого пикселя.
2. Vertex Shaders - тоже самое только вызывается для каждой вершины модели.
Таким образом все операции по обработке вершин и пикселей можно писать на шейдерах и не тратить на них процессорное время. Это дает больше возможностей для реализации техник затенений.
![Page 11: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/11.jpg)
OpenGL Shader Builder от Apple
![Page 12: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/12.jpg)
![Page 13: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/13.jpg)
Рекомендации, часто используемые техники,различные улучшения
![Page 14: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/14.jpg)
Модели и VBOКак лучше:
1. Создавать для каждого объекта свой VBO, слить один раз данные, при условии что они не меняются, а потом при отрисовке перебирать все VBO и выводить?
2. Создать один VBO и каждый раз при отрисовке перебирать все объекты и заливать в него данные при этом не тратя время на переключение между буферами?
![Page 15: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/15.jpg)
РешениеСоздаем один 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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/16.jpg)
Правильная последовательность биндинга
OpenGL объектов - залог производительности
Очень важно во время рендеринга чем по менше использовать операции переключения текущего объекта (например текстуры) или изменения состояния opengl. Для этого нужно иметь так называемый дрокол вывода данных (drawing protocol), который представляет из себя отсортированный список объектов по состояниям отрисовки. Под состояниями понимается: 1. состояния самого opengl 2. текущая текстура 3. трансформации 4. и могут быть какие-то еще свои костомные атрибуты
![Page 17: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/17.jpg)
ПримерЕсть 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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/18.jpg)
Повышение производительности для статической геометрии
•На iPhone лучше всего из всей статической геометрии которая есть на сцене предварительно создать один меш и уже затем его рендерить, если конечно это возможно. Делается для того что бы с помощью одного трансформа отрисовать все статические объекты (за один вызов glDrawElements).
![Page 19: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/19.jpg)
Экспорт 3D объектов из графических редакторов
Maya 3DMax Для этой цели проще всего использовать формат OBJ в который умеет экпортировать почти любой 3D-редактор и который очень простой для парсинга и последующего извлечения данных. Но перед использованием данного формата в своем iPhone приложении его следует предварительно обработать.
![Page 20: OpenGL ES 1.1 и 2.0 для разработки iPhone игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/20.jpg)
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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/21.jpg)
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 игр](https://reader035.vdocument.in/reader035/viewer/2022081502/557f0104d8b42af44a8b4ddd/html5/thumbnails/22.jpg)
Спасибо за вниманиеи
удачных проектов :)
Taras (DoctorSet) Tovchenko
2009