Видео обзор: Moonlights FaceFighter - сфотай, загрузи, побей :)
Июн 15

Настройка OpenGL ES в Xcode на iPhone не представляет собой абсолютно ничего сложного, особенно после того как в пакет SDK разработчики из Apple добавили соответствующий шаблон. Все что нужно — это проект, в который легко и быстро добавляется нужный код. Именно этим мы и займемся в данном уроке.
Откровенно говоря, не вижу необходимости перенабирать весь приведенный здесь код. Если хотите сразу перейти к практическим проектам по OpenGL — пожалуйста. Пропустив урок по настройке, вы ничего не потеряете, поскольку вдаваться в подробности особо я не буду — можете переходить сразу в конец урока и загружать файл проекта.

Для начала запустим Xcode и создадим новый проект. Выберите шаблон “OpenGL ES Application” и сохраните проект, куда сочтете нужным.

figure01

Полагаю, что все уже в общих чертах знакомились с этим шаблоном, а, возможно, даже и запускали приложение. Сейчас нам предстоит удалить код для вращающегося цветного квадрата и добавить в представление буфер глубины (т.е. сделать его по-настоящему трехмерным). Полученный результат пригодится нам для последующих уроков.

Двухмерный в трехмерном

Уроки по OpenGL, как и данный шаблон, по большей части игнорируют глубину, предпочитая двухмерную систему координат (X, Y) стандартной трехмерной (X, Y, Z). Возможно, кто-то обратил внимание на то, что вершины квадрата в шаблоне используют только две координаты (X, Y) — без глубины.
Это пример так называемой ортогональной проекции. Поскольку в предлагаемой серии уроков мы будем осваивать трехмерное пространство, пока на ней останавливаться не будем.

Подключение буфера глубины

Первым делом нужно подключить буфер глубины. Для двухмерного квадрата в шаблоне Z-буфер не нужен, а нам глубина понадобится. Apple любезно предоставила код настройки, которым мы и воспользуемся.

Откройте в редакторе файл “EAGLView.m» и найдите следующую строку:

1
#define USE_DEPTH_BUFFER 0

Величину 0, само собой, нужно изменить на 1 — код настройки представления создаст буфер глубины. Нужный код содержится в методе “createFrameBuffer” — пока он нас не интересует, поскольку написан Apple и свою задачу выполняет.

Теперь активируем в OpenGL тестирование глубины. Для этой цели создадим новый метод, вызываемый единожды для запуска представления. Создайте новый метод с именем “setupView” и добавьте в него приведенный ниже код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)setupView {

const GLfloat zNear = 0.1, zFar = 1000.0, fieldOfView = 60.0;
GLfloat size;

glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);

// Получаем размер, соответствующий экрану iPhone
CGRect rect = self.bounds;
glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);
glViewport(0, 0, rect.size.width, rect.size.height);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

Представленный код задает условия работы OpenGL, создавая View Port с привязкой к реальному размеру экрана. Как уже говорилось выше, подробнее такие моменты мы будем разбирать позже. Пока же обратите внимание на строку, активирующую тестирование глубины в OpenGL.

1
glEnable(GL_DEPTH_TEST);

“Включив” какую-либо опцию в OpenGL, не забывайте в случае ненадобности позже ее “отключать”. Мы же, активировав тестирование глубины, отключать его не будем, поэтому отредактируем настройку представления:

1
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Здесь мы указываем цвет, используемый при очистке экрана. Все цвета в OpenGL ES должны являться RGBA-величинами (т.е. Red, Green, Blue, Alpha), a не просто значениями RGB, как в OpenGL. Теперь при очистке экрана OpenGL ES будет знать, что нам нужен черный цвет, и станет использовать именно его до внесения изменений.

Значения цветов могут варьироваться в пределах 0 -> 1 (с плавающей запятой) или 0 -> 255 для байт без знака. Чем больше значение, тем выше интенсивность цвета.

Возвращаемся к началу файла и находим отредактированный ранее объект “#define“. Здесь вставляем макрос для настройки добавленного метода “setupView“.

1
2
#define USE_DEPTH_BUFFER 1
#define DEGREES_TO_RADIANS(__ANGLE) ((__ANGLE) / 180.0 * M_PI)

Draw View: метод рисования

Следующим шагом переходим к методу “drawView” — именно он станет основной ареной событий в наших уроках (на что разработчики из Apple достаточно непрозрачно нам намекнули).

Для начала удаляем содержимое метода и заменяем его представленным ниже кодом:

1
2
3
4
5
6
7
8
- (void)drawView {
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

Первые три строки кода настраивают область рисования. Две последние — меняют ее местами с текущим содержимым экрана. Те, кому уже приходилось заниматься программированием анимации или игр, знают, что такой способ называется “двойной буферизацией (double buffered).

Для новичков поясню, что мы создаем два идентичных буфера: один для отображения пользователю, второй — для очистки и рисования. По окончании рисования мы опять меняем их местами, показывая пользователю новое представление. Столь сложная схема призвана обеспечить плавность анимации.

Код для вывода реального объекта на экран пока добавлять не будем, а вместо этого закончим настройку.

Первым делом прямо перед методом “dealloc” вставляем следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- (void)checkGLError:(BOOL)visibleCheck {
GLenum error = glGetError();

switch (error) {
case GL_INVALID_ENUM:
NSLog(@"GL Error: Enum argument is out of range");
break;
case GL_INVALID_VALUE:
NSLog(@"GL Error: Numeric value is out of range");
break;
case GL_INVALID_OPERATION:
NSLog(@"GL Error: Operation illegal in current state");
break;
case GL_STACK_OVERFLOW:
NSLog(@"GL Error: Command would cause a stack overflow");
break;
case GL_STACK_UNDERFLOW:
NSLog(@"GL Error: Command would cause a stack underflow");
break;
case GL_OUT_OF_MEMORY:
NSLog(@"GL Error: Not enough memory to execute command");
break;
case GL_NO_ERROR:
if (visibleCheck) {
NSLog(@"No GL Error");
}
break;
default:
NSLog(@"Unknown GL Error");
break;
}
}

В OpenGL предусмотрен вызываемый выше метод проверки ошибок (”glGetError()“), но возвращаемый им код приходится вручную преобразовывать в удобоваримое для человека сообщение. Этим и занимается представленный выше метод.

Булев параметр “visibleCheck” нужен только для того, чтобы время от времени проверять вызовы подпрограмм и отсутствие ошибок.

И, наконец, отредактируем файл “EAGLView.m“, который должен обращаться к методу “initWithCode“, вызывая созданный ранее метод “setupView“. Под параметрами переменной “animationInterval” вставьте приведенный ниже код для вызова “setupView“:

1
[self setupView];

Вместо создания нового метода, вызываемого всего один раз, мы, конечно же, мы могли добавить код метода “setupView” в метод “initWithCoder”.

С файлом “EAGLView.m” закончили — переходим к “EAGLView.h“.

“EAGLView.h”

Сразу обрадую: здесь работы немного. Все, что нужно, — создать прототипы для двух созданных нами методов:

1
2
- (void)setupView;
- (void)checkGLError:(BOOL)visibleCheck;

На этом урок закончен.

Следующие шаги…

Если теперь скомпоновать и запустить приложение в симуляторе, то кроме пустого экрана ничего интересного вы не увидите. В следующем уроке приступим к рисованию на экране простейших объектов — точек, линий и треугольников.

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 4.00 из 5)
Загрузка ... Загрузка ...

2 Pings to “Уроки iPhone SDK: (Часть 1) OpenGL ES: настройка проекта в Xcode”

  1. Уроки iPhone SDK: (Часть 2) OpenGL ES: рисование базовых фигур (треугольники) | LookApp.ru - обзоры программ и игр для iPhone Says:

    [...] делом создайте копию проекта из урока “OpenGL ES: настройка проекта в Xcode” или загрузите исходный код отсюда. Открыв проект в [...]

  2. RUSSIAN BLACKEDITION » Blog Archive » Разработка под Mac OS X и iPhone / Перевод OpenGL ES: рисование базовых фигур (треугольники) Says:

    [...] дeлoм создайте кoпию проекта с урoкa "OpenGL ES: отрегулировка проекта в Xcode" не то — не то зaгрузитe исходный шифр отсюда. Открыв [...]


3 Responses to “Уроки iPhone SDK: (Часть 1) OpenGL ES: настройка проекта в Xcode”

  1. 1. Я интересуюсь вашим проектом Says:

    Кто админ?Очень интересный сайт.Хотелось бы связаться.

  2. 2. Artem Says:

    E-Mail для связи со мной lookapp@gmail.com

  3. 3. aoni1 Says:

    Не могу понять куда вставлять [self setupView];
    Поможите чем можите!
    и есть ли возможность скачать исходники??

Оставьте комментарий