Главная » Программирование игр под Android » ЧТО ТАКОЕ OPENGL ES И ПОЧЕМУ ОБ ЭТОМ СТОИТ ЗАДУМАТЬСЯ – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

OpenGL ES – это промышленный стандарт для графического программирования (3D), предназначенный для мобильных и встраиваемых устройств. Он обслуживается Khronos Group – объединением.таких компаний, как ATI, NVIDIA, и Intel, которые вместе определяют и расширяют этот стандарт.

Если говорить о стандартах, на данный момент существуют три версии OpenGL ES: 1.0,1.1 и 2.0. В этой е мы собираемся рассмотреть первые две. Все устройства, работающие на Android, поддерживают OpenGL ES 1.0, большинство из них также поддерживают 1.1, которая отличается от 1.0 некоторыми новыми особенностями. Как ни странно, OpenGL ES 2.0 несовместима с версиями 1х. Вы можете использовать или 1х, или 2.0, однако не две версии одновременно. Дело в том, что версии 1 х используют модель программирования Контейер с фиксированной функциональностью (fixed-function pipeline), в то время, как 2.0 позволяет программно описать элементы потокового рендеринга с помощью так называемых шейдеров.

OpenGL ES 1.x более чем достаточно для большинства игр, так что мы будем работать именно с этим стандартом.

ПРИМЕЧАНИЕ

Эмулятор поддерживает только OpenGL ES 1.0. Тем не менее реализация немного ненадежная, так что никогда не тестируйте программу на эмуляторе, используйте настоящее устройство.

OpenGL ES – это API в виде набора заголовочных файлов на языке С, которые предоставлены Khronos Group вместе с очень подробной сиецфикацией того, как должны работать API, описанные в этих заголовках. Спецификация, в частности, описывает, как должны визуализироваться пикселы и строки. Производители оборудования используют эту спецификацию и реализуют ее в своих графических процессорах. Качество подобных реализаций немного различается: некоторые компании строго придерживаются стандарта (PowerVR), в то время как другие испытывают с этим сложности. Иногда это приводит к ошибкам реализации, связанным с графическим процессором, эти ошибки обусловлены не ОС Android, а самим оборудованием. При изучении OpenGL ES мы также рассмотрим возможные проблемы, специфичные для отдельных устройств.

ПРИМЕЧАНИЕ

OpenGL ES в какой-то мере подобен более мощному стандарту OpenGL, рассчитанному на работу с настольными системами. OpenGL ES основан на OpenGL, однако некоторый функционал в OpenGL ES представлен в ограниченном объеме или вообще отсутствует. Тем не менее мы можем написать приложение, которое будет соответствовать обеим спецификациям, что весьма удобно, если вы хотите, чтобы ваша программа запускалась и на ПК.

Что же делает OpenGL ES? Если ответить в нескольких словах, это достаточно простая программа для визуализации треугольников. Однако мы с вами разберем все подробно.

Модель разработки: аналогия

OpenGL ES является общим программным API для ЗО-графики. Он отличается достаточно удобными и (надеюсь) легкими для понимания моделями разработки, которые мы сможем проиллюстрировать простой аналогией.

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

В этот кратчайший момент ничего не движется и остается в таком положении, какое запечатлено на фотографии со всеми конфигурациями позиций, ориентациями, текстурами, материалами и освещением. На рис. 7.1 показана абстрактная сцена с фотоаппаратом, светом и тремя предметами из различных материалов.

Рис. 7.1. Абстрактная сцена

Каждый объект имеет позицию и ориентацию относительно начала координат сцены. Фотоаппарат, обозначенный символом глаз, также расположен относительно начала координат. Пирамида на рис. 7.1 – это так называемый отображаемый объем или видимое пространство, то есть конус, который показывает, какую часть сцены захватывает камера и как камера ориентирована. Маленький белый шарик с лучами обозначает источник света, который также расположен относительно начала координат.

Мы можем напрямую перенести эту сцену в OpenGL ES, но для начала нам нужно описать несколько вещей.

Объекты (или модели). Как правило, они определяются их геометрией, цветом, текстурами и материалом. Геометрия определяется как набор треугольников. Каждый треугольник состоит из трех точек в трехмерном пространстве, так что у нас есть х-, у- и 2-координаты, расположенные относительно начала координат, как на рис. 7.1. Обратите внимание, что ось г направлена в нашу сторону. Как правило, цвет определяется в уже знакомом нам формате RGB. Текстуры и материалы требуют более подробного описания. Мы поговорим о них позже.

Освещение. OpenGL ES предлагает несколько типов освещения с различными атрибутами. Это просто математические объекты, которые имеют местоположение и/или направление в ЗО-пространстве, а также атрибуты, в частности, цвет.

Камера. Это также математический объект, расположенный в ЗО-пространстве. У него тоже есть параметры, которые определяют, какую часть изображения мы видим. Все эти параметры вместе определяют отображаемый объем, также называемый видимым пространством (усеченная пирамида, показанная на рис. 7.1). Камера фиксирует все, что находится внутри этой пирамиды, а все, что располагается вне ее не попадает на фотографию.

Область просмотра. Определяет размер и разрешение конечного изображения. Этот параметр можно сравнить с типом пленки, вставляемой в фотоаппарат, или с разрешением изображения, когда снимок сделан на цифровую камеру.

При наличии всего этого OpenGL ES может создать 20-цзображение с точки обзора фотоаппарата. Обратите внимание, что мы описываем все в ЗО-пространстве. Как же это будет выглядеть в OpenGL ES в двухмерном пространстве?

Проекции

2D -отображение создается с помощью проекций. Мы уже говорили о том, что OpenGL ES в первую очередь работает с треугольниками. Один треугольник имеет три точки в ЗО-пространстве. Чтобы визуализировать такой треугольник в фрейм-буфере, OpenGL ES необходимо знать координаты этих ЗО-точек в пиксельной координатной системе фреймбуфера. Если ему известны три данные координаты точек, он может просто нарисовать в фреймбуфере все пикселы, которые находятся внутри треугольника. Мы можем даже нарисовать собственную небольшую реализацию OpenGL ES, проецируя ЗО-точки в 2D и просто рисуя линии между ними с помощью Canvas.

Существует два типа проекций, которые обычно используются в ЗО-графике.

Параллельная, или ортогональная, проекция. Если вы когда-либо работали с CAD-приложениями, то наверняка с ней сталкивались. В параллельной проекции неважно, насколько предмет удален от фотоаппарата. Предмет всегда будет одного и того же размера на конечном снимке. Как правило, этот тип проекции используется для визуализации 20-графики в OpenGL ES.

Перспективные проекции. Так мы видим. Предметы, более удаленные от нас, кажутся на нашей сетчатке меньше. Данный тип проекции обычно используется для 3D -графики в OpenGL ES.

В обоих случаях нам необходима плоскость проекции. Она аналогична сетчатке глаза. Именно на эту плоскость падает свет, и образуется конечный снимок.

Сетчатка, в отличие от математического пространства, имеет небольшой конечный размер. Сетчатка OpenGL ES равна прямоугольнику на вершине конуса отображения, как на рис. 7.1.

Эта часть конуса отображения показывает, как будет направлена проекция в OpenGL ES. Она называется ближней плоскостью отсечения и имеет свою двухмерную систему координат. На рис. 7.2 показана эта плоскость отсечения с точки зрения камеры с наложением системы координат.

Рис. 7.2. Ближняя плоскость отсечения (она же – плоскость проекции) и ее система координат

Обратите внимание на то, что система координат никак не фиксирована. Мы можем ею управлять, то есть можем работать в такой системе координат проекции, в какой захотим (например, можем указать OpenGL ES, что начало координат должно быть в нижнем левом углу, и сделать так, чтобы видимая зона нашей сетчатки состояла из 480 единиц по оси х и 320 единиц по оси у). Да, OpenGL ES позволяет нам установить любую систему координат для проецируемых точек.

Когда мы укажем конус отображения, OpenGL ES возьмет все точки треугольника и проведет от каждой из них луч через плоскость проекции. Различие между параллельной проекцией и перспективной проекцией заключается в том, какое направление имеют эти лучи. На рис. 7.3 показана разница между ними (вид сверху).

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

Рис. 7.3. Проекция перспективы (слева) и параллельная проекция (справа)

Как я уже отмечал, плоскость проекции на языке OpenGL ES называется ближней плоскостью отсечения. Все стороны конуса отображения имеют похожие названия. Самая отдаленная часть именуется дальней плоскостью отсечения. Остальные называются левой, правой, верхней и нижней плоскостями отсечения. Все, что находится за этими плоскостями, отображаться не будет. Объекты, которые частично находятся в конусе отображения, будут разрезаны этими плоскостями. Это значит, что часть предмета будет отсечена. Именно поэтому такие плоскости и называют плоскостями отсечения.

Может возникнуть вопрос: почему конус в параллельной проекции на рис. 7.3 прямоугольный? Дело в том, что проекция зависит от того, как мы определим плоскости отсечения. В случае перспективной проекции левая, правая, верхняя и нижняя плоскости не перпендикулярны ближней и дальней плоскостям отсечения. См. рис. 7.3, который показывает только левую и правую плоскости отсечения. В случае с параллельной проекцией эти плоскости перпендикулярны, благодаря чему OpenGL ES отображает все предметы в одинаковом масштабе независимо от того, насколько предмет удален от камеры.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии