OpenGL: розплющ очі на тривимірну графіку

Арсеній Чеботарьов

Сучасний світ вже немислимий без тривимірної графіки – в тому числі інтерактивною. Свого часу було зроблено безліч спроб створити універсальну мову опису тривимірних сцен. Найбільш вдалою виявилася спроба компанії Silicon Graphics – її мову OpenGL отримав всесвітнє визнання

Багато з вас знають, що всі найкрасивіші спецефекти, а також майже вся промислова 3D графіка рендерится у форматі OpenGL. Цей формат був розроблений Silicon Graphics і в даний час став стандартом де-факто для тривимірного моделювання. Я спробую дати короткий огляд цієї технології.

Принципи

Основна ідея OpenGL: графічна бібліотека повинна бути апаратно незалежною, але в той же час використовувати апаратні прискорювачі, якщо вони доступні. Крім того, цю мову з самого початку передбачав механізм розширення та гнучкості – у міру того як розширення ставали "загальноприйнятими", вони ставали частиною такого релізу.

Для будь-якого протоколу, будь то мережевий протокол або мова опису сцен, важливим є питання рівня абстракції – тобто того, на якому рівні працює така система або протокол, що є вхідними даними і що вихідними, які компоненти будуть взаємодіяти як постачальників і приймачів даних. Говорячи просто, потрібно визначитися з питання "що ми робимо і чого не робимо".

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

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

З точки зору програміста, OpenGL – це система викликів процедур з передачею їм параметрів, тобто ця мова представляє собою Call Level API. Ключовим моментом з точки зору продуктивності, особливо в мережевому оточенні, є наявність двох режимів: покрокового і пакетного. Пакетний групує команди опису об'єктів та режимів у пакет, званий списком відображення (display list). Подібна техніка застосовується, наприклад, при описі сторінок в PostScript або, в дещо іншому контексті, при створенні збережених процедур в SQL. Сенс зрозумілий – інкапсуляція функціональності (в даному випадку – об'єктів для подальшого багаторазового використання). При цьому можна провести кілька оптимізацій: попередньо один раз перевірити синтаксис, а також кешувати готовий об'єкт при передачі по мережі на цільовий машині.

Недолік списку відображення проявляється при частому внесення до нього змін – при цьому, зрозуміло, жоден метод оптимізації не буде працювати. Для роботи з такими "мінливими" об'єктами і сценами в OpenGL передбачений режим прямого відображення, коли кожне речення інтерпретується в порядку надходження, не чекаючи закриває список тега або якийсь подібної команди на відтворення зображення. У практиці обидва методу знайшли широке застосування.

Архітектура

Більш глибоко занурюючись у технологію OpenGL, ми виявимо струнку і гармонічну архітектуру, загальний вид якої
зображений на малюнку.

Точно так само, як процесор має два типи конвеєрів – для цілочисельних обчислень і чисел з плаваючою точкою, OpenGL має два конвеєри для піксельних даних і вертексних операцій, тобто для операцій з векторними даними. Кожен з потоків обробляється окремо, до тих пір поки це можливо – тобто до стадії меппінга, коли піксельні растри як фактури "натягаються" на площині і більш складні поверхні.

Перший етап – апроксимація кривих і поверхонь обчисленням поліномів від вхідних значень. Другий прохід оперує з примітивами типу точок, відрізків і полігонів – вони перетворюються за правилами афінних перетворень, поєднуються і сцена відсікається у підготовці до растрування.

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

Готові фрагменти остаточно обробляються перед тим, як вони реально будуть внесені до frame buffer. Зокрема, фрагменти сортуються залежно від значень "глибини" – і ці значення порівнюються з відомими на предмет рекомпозіціі. Застосування блендінга призводить до того, що прозорі фрагменти беруть колір, що складається з їх власного і квітів "нижче лежачих" фрагментів. Додатково може бути реалізовано маскування і інші ефекти.

Піксельний процесор в ході растрування вбудовує двовимірні бітові фрагменти прямо в кадр. Частина готового кадру також може бути прочитана для повторного використання як масив пікселів – так що дані, що відображаються в буфері, можуть стати частиною інших сцен.

Пріоритети

При реалізації автори ставили собі п'ять орієнтирів, важливих з точки зору отримуваних результатів.


  1. Продуктивність. З самого початку в OpenGL була закладена "вкрай бажана" можливість відтворення динамічних сцен. Для отримання потрібних результатів у систему введено безліч параметрів, або, як кажуть, режимів малювання. Якщо певний режим або комбінація режимів на даному обладнанні не в змозі забезпечити інтерактивної взаємодії і необхідної частоти оновлення сцени, то користувач чи сама програма повинні бути в змозі відключати так багато додаткових функцій, скільки потрібно для отримання "живої" картинки.

  2. Ортогональність. По можливості всі функції OpenGL є ортогональними, тобто незалежними. Ви можете використовувати їх у довільній комбінації, наприклад використання меппінга не обмежує можливостей застосування світлотіні.

  3. Повнота. Наскільки це є можливим, OpenGL відповідає набору функцій, що надається сучасними апаратними засобами графічної акселерації. OpenGL намагається уникати всього, що має бути реалізовано програмно. З іншого боку, принаймні, гарантується отримання робочої картинки, навіть якщо продуктивність і не дозволяє отримати її з усіма подробицями. Тобто, якщо щось працює на одній платформі, то цей же код буде працювати і на іншій – хоча, можливо, і з іншим результатом.

  4. Інтероперабельність. У мережевому оточенні важливо передавати дані між різними платформами. Тому OpenGL заздалегідь орієнтований на роботу в режимі клієнт-сервер, навіть якщо і клієнт і сервер розташовані на одному комп'ютері.

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

Функції

Нижче перераховані основні функції OpenGL, про деякі з них вже згадувалося. За ним ви можете судити про рівень мови і використовуваних примітивах.

Ресурси

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

Друга книга (а можливо, по порядку прочитання і перша) – це OpenGL Programming Guide, так звана Червона книга.

Червона книга постачена прикладами, на які я б радив звернути найпильнішу увагу. До слова: зазначені посилання ведуть до застарілих версіями документації, не описує нові можливості. Нові версії доступні тільки в друкованому вигляді. Можете спробувати знайти їх через мережі P2P – однак результати такого пошуку пророкувати не беруся.

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


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

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

Ваш отзыв

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

*

*