ЩО ТАКЕ OPENGL ES І ЧОМУ ПРО ЦЕ ВАРТО ЗАМИСЛИТИСЯ – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

OpenGL ES – це промисловий стандарт для графічного програмування (3D), призначений для мобільних і вбудованих пристроїв Він обслуговується Khronos Group – обедіненіемтакіх компаній, як ATI, NVIDIA, і Intel, які разом визначають і розширюють цей стандарт

Якщо говорити про стандарти, на даний момент існують три версії OpenGL ES: 10,11 і 20 У цій е ми збираємося розглянути перші два Всі пристрої, що працюють на Android, підтримують OpenGL ES 10, більшість з них також підтримують 11, яка відрізняється від 10 деякими новими особливостями Як не дивно, OpenGL ES 20 несумісна з версіями 1х Ви можете використовувати або 1х, або 20, проте не дві версії одночасно Справа в тому, що версії 1 х використовують модель програмування Контейер з фіксованою функціональністю (fixed-function pipeline), в той час, як 20 дозволяє програмно описати елементи потокового рендеринга за допомогою так званих шейдерів

OpenGL ES 1x більш ніж достатньо для більшості ігор, так що ми будемо працювати саме з цим стандартом

ПРИМІТКА

Емулятор підтримує тільки OpenGL ES 10 Проте реалізація трохи ненадійна, так що ніколи не тестируйте програму на емуляторі, використовуйте даний пристрій

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 працює як фотоапарат Щоб зробити знімок, вам спочатку треба прийти на місце, яке ви хочете зняти Ваша сцена складається з декількох обєктів, припустимо, з столу з декількома предметами на ньому Всі ці предмети мають місце розташування і орієнтацію щодо камери Вони складаються з різних матеріалів і мають різні текстури Стекпо прозоро і трохи відображає, стіл, скоріше всього, зроблений з дерева, на обкладинці журналу видна фотографія політика і т д Деякі предмети навіть можуть рухатися, наприклад муха, від якої ви ніяк не можете позбутися Ваш фотоапарат також має ряд характеристик: фокусна відстань, зона огляду, дозвіл зображення, розмір фотографії, його власне місце розташування і орієнтація в просторі (щодо початку координат) Нехай навіть все обєкти і фотоапарат рухаються, але коли ви натискаєте кнопку, щоб зробити знімок, ви отримуєте застигле зображення, де нічого не рухається (ми в даному випадку ігноруємо швидкість роботи затвора, через якої зображення може вийти трохи розмитим)

У цей найкоротший момент нічого не рухається і залишається в такому положенні, яке відображене на фотографії з усіма конфігураціями позицій, орієнтаціями, текстурами, матеріалами і освітленням На рис 71 показана абстрактна сцена з фотоапаратом, світлом і трьома предметами з різних матеріалів

Рис 71 Абстрактна сцена

Кожен обєкт має позицію і орієнтацію відносно початку координат сцени Фотоапарат, позначений символом очей, також розташований відносно початку координат Піраміда на рис 71 – це так званий що відображається обєм або видимий простір, тобто конус, який показує, яку частину сцени захоплює камера і як камера орієнтована Маленький білий кульку з променями позначає джерело світла, який також розташований відносно початку координат

Ми можемо безпосередньо перенести цю сцену в OpenGL ES, але для початку нам потрібно описати кілька речей

Обєкти (або моделі) Як правило, вони визначаються їх геометрією, кольором, текстурами і матеріалом Геометрія визначається як набір трикутників Кожен трикутник складається з трьох точок у тривимірному просторі, так що у нас є х-, у-і 2-координати, розташовані відносно початку координат, як на рис 71 Зверніть увагу, що вісь г направлена ​​в нашу сторону Як правило, колір визначається у вже знайомому нам форматі RGB Текстура і матеріали вимагають більш докладного опису Ми поговоримо про них пізніше

Освітлення OpenGL ES пропонує кілька типів освітлення з різними атрибутами Це просто математичні обєкти, які мають місце розташування і / або напрямок в ЗО-просторі, а також атрибути, зокрема, колір

Камера Це також математичний обєкт, розташований в ЗО-просторі У нього теж є параметри, які визначають, яку частину зображення ми бачимо Всі ці параметри разом визначають відображається обсяг, також званий видимим простором (усічена піраміда, показана на рис 71) Камера фіксує все, що знаходиться всередині цієї піраміди, а все, що розташовується поза її не потрапляє на фотографію

Область перегляду Визначає розмір і дозвіл кінцевого зображення Цей параметр можна порівняти з типом плівки, що вставляється в фотоапарат, або з роздільною здатністю зображення, коли знімок зроблений на цифрову камеру

При наявності всього цього OpenGL ES може створити 20-цзображеніе з точки огляду фотоапарата Зверніть увагу, що ми описуємо все в ЗО-просторі Як же це буде виглядати в OpenGL ES в двомірному просторі

Проекції

2D-відображення створюється за допомогою проекцій Ми вже говорили про те, що OpenGL ES в першу чергу працює з трикутниками Один трикутник має три точки в ЗО-просторі Щоб візуалізувати такий трикутник в фрейм-буфері, OpenGL ES необхідно знати координати цих ЗО-точок у пиксельной координатної системі фреймбуфер Якщо йому відомі три дані координати точок, він може просто намалювати в фреймбуфер всі пікселі, які знаходяться всередині трикутника Ми можемо навіть намалювати власну невелику реалізацію OpenGL ES, проектуючи ЗО-точки в 2D і просто малюючи лінії між ними за допомогою Canvas

Існує два типи проекцій, які зазвичай використовуються в ЗО-графіці

Паралельна, або ортогональна, проекція Якщо ви коли-небудь працювали з CAD-додатками, то напевно з нею стикалися У паралельній проекції неважливо, наскільки предмет віддалений від фотоапарата Предмет завжди буде одного і того ж розміру на кінцевому знімку Як правило, цей тип проекції використовується для візуалізації 20-графіки в OpenGL ES

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

В обох випадках нам необхідна площину проекції Вона аналогічна сітківці ока Саме на цю площину падає світло, і утворюється кінцевий знімок

Сітківка, на відміну від математичного простору, має невеликий кінцевий розмір Сітківка OpenGL ES дорівнює прямокутнику на вершині конуса відображення, як на рис 71

Ця частина конуса відображення показує, як буде спрямована проекція в OpenGL ES Вона називається ближньої площиною відсікання і має свою двомірну систему координат На рис 72 показана ця площина відсікання з точки зору камери з накладенням системи координат

Рис 72 Ближня площину відсікання (вона ж – площина проекції) та її система координат

Зверніть увагу на те, що система координат ніяк не фіксована Ми можемо нею управляти, тобто можемо працювати в такій системі координат проекції, в якій захочемо (наприклад, можемо вказати OpenGL ES, що початок координат має бути в нижньому лівому кутку, і зробити так, щоб видима зона нашої сітківки складалася з 480 одиниць по осі х і 320 одиниць по осі у) Так, OpenGL ES дозволяє нам встановити будь-яку систему координат для проецируемих точок

Коли ми вкажемо конус відображення, OpenGL ES візьме все точки трикутника і проведе від кожної з них промінь через площину проекції Різниця між паралельної проекцією і перспективною проекцією полягає в тому, який напрямок мають ці промені На рис 73 показана різниця між ними (вид зверху)

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

Рис 73 Проекція перспективи (ліворуч) і паралельна проекція (праворуч)

Як я вже зазначав, площину проекції на мові OpenGL ES називається ближньої площиною відсікання Всі сторони конуса відображення мають схожі назви Найвіддаленіша частина іменується дальньої площиною відсікання Решта називаються лівою, правою, верхньої та нижньої площинами відсікання Все, що знаходиться за цими площинами, відображатися не буде Обєкти, які частково знаходяться в конусі відображення, будуть розрізані цими площинами Це означає, що частина предмета буде відсічена Саме тому такі площини і називають площинами відсікання

Може виникнути питання: чому конус в паралельній проекції на рис 73 прямокутний Справа в тому, що проекція залежить від того, як ми визначимо площині відсікання У разі перспективної проекції ліва, правая, верхня і нижня площини не перпендикулярні ближньої і дальньої площин відсікання Див рис 73, який показує тільки ліву і праву площині відсікання У випадку з паралельної проекцією ці площини перпендикулярні, завдяки чому OpenGL ES відображає всі предмети в однаковому масштабі незалежно від того, наскільки предмет віддалений від камери

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*