МАМА, ДИВИСЬ: Я намальованими червоною ТРИКУТНИК.

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

Визначення області перегляду

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

Координати хіу задають верхній лівий кут області перегляду в фреймбуфер, awidth і height задають розмір області перегляду у точках Зверніть увагу, що OpenGL ES ставить початок координат фреймбуфер в лівому нижньому кутку екрана Зазвичай ми присвоюємо початку координат значення нуль, а параметри wi dth і hei ght робимо рівними висоті і ширині екрану, оскільки працюємо в повноекранному режимі Можна було б вказати OpenGL ES використовувати при такому підході тільки частина фреймбуфер Тоді відображається графіка була б автоматично вписана в потрібні розміри

ПРИМІТКА

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

Визначення матриці проекції

Далі нам необхідно визначити матрицю проекції Оскільки нас цікавить тільки 20-графіка, ми будемо використовувати паралельну проекцію Як це зробити

Режими матриці і активні матриці

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

Параметр mode може бути виражений через GL10GL PR0JECTI0N, GL10GL MODELVIEW або GL10 GL TEXTURE Напевно, і так зрозуміло, яка з цих констант активізує кожну матрицю Усі наступні виклики методів управління матрицями будуть спрямовані на матрицю, яку ми встановили в цьому методі, до тих пір, як знову не змінимо активну матрицю, ще раз викликавши цей метод Режим матриці є одним із станів OpenGL ES, яке також буде втрачено в разі втрати контексту, (яка відбувається, якщо додаток було поставлено на паузу і відновлено) Для управління матрицею проекції і всіх наступних викликів ми можемо викликати метод таким чином:

Ортогональна проекція із застосуванням glOrthof

OpenGL ES пропонує наступний метод для установки в активній матриці ортографической проекції:

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

OpenGL ES має стандартну систему координат, як на рис 75 Позитивні точки по осі х знаходяться праворуч, позитивні точки осі у – вгорі, а позитивні точки осі z направлені в нашу сторону За допомогою glOrthof ми описуємо конус відображення нашої паралельної проекції в даній системі координат Якщо знову поглянути на рис 73, то ми побачимо, що конус в паралельній проекції має форму куба Ми можемо розглядати параметри для gl Orthof як визначальні два кута нашого конуса-куба (рис 75)

Рис 75 Ортогональний конус відображення

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

Оскільки нас цікавить 2D-графіка, ми визначимо кутові точки (ліва нижня найближча) і (права верхня дальня) (див рис 75) таким чином, щоб можна було працювати у своєрідній пиксельной системі координат, як ми це робили з Canvas і містером номом Ось як створити подібну систему координат:

Рис 76 Паралельна проекція конуса відображення для візуалізації 2D за допомогою OpenGL ES

Наш конус відображення досить тонкий, проте це нормально, оскільки ми працюємо в 2D Видима частина системи координат знаходиться в діапазоні від (0, 0, 1) до (480 320 -1) Будь-які точки, які ми описуємо всередині даної зони, будуть також видимі на екрані Ці точки будуть проектуватися на передню частину куба, яка є ближній площиною відсікання Потім проекція буде розтягнута до розміру області перегляду незалежно від її розмірів Припустимо, у нас є Nexus One з роздільною здатністю 800 х 480 пікселів в альбомній орієнтації Коли ми описуємо конус відображення так, як тільки що було показано, ми можемо працювати в системі координат 480 х 320, a OpenGL розтягне зображення до фреймбуфер 800 х 480 (якщо ми вирішили, що область перегляду повинна охоплювати весь фреймбуфер) До речі, ніщо нам не заважає використовувати і конуси відображення більш дивної форми Наприклад, ми могли б взяти конус, в якому кути мають координати (-1 -1 100) і (2 2 -100) Все, що потрапляє всередину даній області, буде в підсумку розтягнуто до необхідного розміру і показано на екрані Досить зручно

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

ПРИМІТКА

Можливо, ви помітили, що вісь у тепер спрямована вгору, а її початок знаходиться в нижньому лівому куті екрану Незважаючи на те що Canvas, фреймворк для користувача інтерфейсу і багато інших API, візуалізуючих 2D, використовують систему, де вісь у починається у верхньому лівому кутку і йде вниз, для програмування ігор набагато зручніше застосовувати дану нову систему координат Наприклад, якщо Маріо стрибає, хіба ви не очікував, що його у-координата буде зростати замість того, щоб зменшуватися Хочете працювати в іншій системі координат Добре, просто поміняйте місцями верхній і нижній параметри glOrthof Також, хоча зображення конуса відображення виглядає правильно з геометричної точки зору, передня і далека площині відсікання виглядають для glOrthofO дещо по-іншому Оскільки це трохи складно, давайте просто прикинемося, що попередні ілюстрації виглядають правильно

Корисний фрагмент

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

Зачекайте, а що ж робить тут gl Loadldenti ty Справа в тому, що більшість методів, які пропонує OpenGL ES для управління активною матрицею, на практиці не задають матрицю Замість цього вони створюють тимчасову матрицю з необхідними параметрами і множать її на поточну матрицю Метод glOrthof – не виняток Наприклад, якби ми в кожному кадрі викликали glOrthof, ми множили б матрицю проекції дуже багато разів Так що замість цього перед тим, як множити матрицю проекції, ми краще перевіримо, чи є у нас в запасі чиста одинична матриця Як ви памятаєте, множення одиничної матриці на іншу матрицю не змінює цю непоодинокі матрицю Ось навіщо нам знадобиться gl Loadldenti ty С) Вважайте, що ми спочатку завантажуємо значення 1, а потім множимо його на потрібну матрицю (в нашому випадку це матриця проекції, створена glOrthofO)

Зверніть увагу, що система координат тепер знаходиться в діапазоні від (0, 0, 1) до (320 480 -1) – це для візуалізації в книжковій орієнтації

Визначення трикутників

Далі необхідно зясувати, як повідомити OpenGL ES про трикутниках, які ми хочемо візуалізувати Визначимо для початку, з чого складається трикутник: трикутник складається з трьох точок кожна точка називається вершиною вершина має положення в ЗО-просторі розташування в ЗО-просторі вказано у вигляді трьох чисел з плаваючою точкою, що визначають х-, у-і z-координати вершина може мати такі додаткові атрибути, як колір і текстурні координати (ми поговоримо про це трохи пізніше) Ця інформація також може виражатися в числах з плаваючою точкою

OpenGL ES буде відсилати опису наших трикутників у вигляді масивів Проте, якщо враховувати, що OpenGL ES фактично є API на мові С, ми не можемо використовувати стандартні масиви Java Замість цього ми застосовуватимемо буфери Java NIO, які є звичайними блоками памяті з послідовних байтів

Джерело: 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>

*

*