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

Полагаю, что все уже в общих чертах знакомились с этим шаблоном, а, возможно, даже и запускали приложение. Сейчас нам предстоит удалить код для вращающегося цветного квадрата и добавить в представление буфер глубины (т.е. сделать его по-настоящему трехмерным). Полученный результат пригодится нам для последующих уроков.
Двухмерный в трехмерном
Уроки по 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 обязательна.
2 Pings to “Уроки iPhone SDK: (Часть 1) OpenGL ES: настройка проекта в Xcode”
3 Responses to “Уроки iPhone SDK: (Часть 1) OpenGL ES: настройка проекта в Xcode”
-
1. Я интересуюсь вашим проектом Says:
Июнь 15th, 2009 at 20:02Кто админ?Очень интересный сайт.Хотелось бы связаться.
-
2. Artem Says:
Июнь 15th, 2009 at 22:59E-Mail для связи со мной lookapp@gmail.com
-
3. aoni1 Says:
Март 9th, 2010 at 11:08Не могу понять куда вставлять [self setupView];
Поможите чем можите!
и есть ли возможность скачать исходники??

(2 голосов, средний: 4.00 из 5)
Июнь 16th, 2009 at 12:30
[...] делом создайте копию проекта из урока “OpenGL ES: настройка проекта в Xcode” или загрузите исходный код отсюда. Открыв проект в [...]
Август 31st, 2009 at 18:00
[...] дeлoм создайте кoпию проекта с урoкa "OpenGL ES: отрегулировка проекта в Xcode" не то — не то зaгрузитe исходный шифр отсюда. Открыв [...]