OpenGL являється інтерфейсом до графічного устаткування. Даний інтерфейс складається приблизно з 150 окремих команд які ви використовуєте для вказування об'єктів і операцій, які необхідні для створення програм, що генерують трьох-вимірну графіку.

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

Бібліотека яка забезпечує складний функціонал може бути побудованою над OpenGL. Бібліотека OpenGL Utility Library (GLU) забезпечує велику кількість методів моделювання, на подобі квадратних поверхонь і NURBS-ліній і поверхонь. GLU являється стандартною частиною кожної реалізації OpenGL. Також присутня високорівневий, об'єктно-орієнтований інструментарій - Open Inventor, який побудований поверх OpenGL і доступний окремо для великої кількості реалізацій OpenGL.

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

  • Створення фігур з геометричних примітивів (OpenGL вважає примітивами точки, лінії, полігони, зображення і карти точок - bitmap), тобто створення математичного опису об'єктів.
  • Розміщення об'єктів у тривимірному просторі і обрання бажаної точки для перегляду компонованої сцени.
  • Обрахування кольору усіх об'єктів. Колір може бути безпосередньо присвоєним програмою, визначеним через певні параметри освітлення, присвоєний за допомогою накладеної на форму текстури, або деякою комбінацією з цих трьох методів.
  • Перетворення математичного опису об'єктів і їхньої асоційованої інформації про колір у пікселі на екран. Цей процес називається растеризацією.

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

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

OpenGL як машина стану

OpenGL являється машиною стану. Ви встановлюєте декілька станів (або режимів), які впливають на результат поки ви не зміните їх. Наприклад, поточний колір являється змінною стану. Ви можете встановити поточний колір у білий, червоний, або будь-який інший колір, і після цього кожен об'єкт буде малюватись на екрані даним кольором, поки ви не встановите поточний колір у який-небудь інший. Поточний колір являється одним з багатьох змінних стану, які підтримує OpenGL. Інші змінні контролюють такі аспекти як поточна матриця проекції і перегляду, шаблони відмальовування ліній і полігонів, режими відмальовування полігонів, позиція і характеристики світла і характеристики матеріалу відмальовуваного об'єкту. Велика кількість станових змінних відноситься до режимів, які вмикаються або вимикаються за допомогою команд glEnable() або glDisable().

Кожна змінна стану або режиму має своє значення за умовчанням, і у будь-який момент ви можете надіслати запит до системи для отримання її поточного стану. Зазвичай, ви використовуєте одну з шести наступних команд для того щоб це зробити: glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetIntegerv(), glGetPointerv() або glIsEnabled(). Яку команду вам необхідно обрати залежить від даних, які ви хочете отримати. Деякі змінні стану мають більш специфічні команди опитування (на подобі glGetLight*(), glGetError() або glGetPolygonStripple()). Більше того, ви можете зберегти колекцію змінних стану у стеку атрибутів за допомогою glPushAttrib() або glPushClientAttrib(), тимчасово модифікуючи їх для того, щоб через деякий час відновити їхні попередні значення за допомогою команди glPopAttrib() або glPopClientAttrib(). Для тимчасових змін станів, необхідно надавати перевагу даним командам, ніж встановлювати їх значення через команди запитів, оскільки вони менш ефективні.

Конвеєр відмальовування OpenGL

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

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

[caption id="attachment_1452" align="aligncenter" width="1077"]Конвеєр відмальовування OpenGL Конвеєр відмальовування OpenGL[/caption]

Списки відображення

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

Обчислювачі

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

По-вертексні операції

Для вертексних даних, наступною стадією є "по-вертексні операції", які перетворюють вертекси у примітиви. Деякі вертексні дані (наприклад, просторові координати) перетворюються за допомогою матриць розміром 4х4 з дійсними значеннями. Просторові координати проектують з позиції тривимірного світу на позицію екрану користувача.

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

Складання примітивів

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

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

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

Піксельні операції

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

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

Існують спеціальні операції копіювання пікселів для копіювання даних у буфер кадру для інших частин кадру або у текстурну пам'ять. Один прохід виконується через піксельні операції перетворення перед тим, як дані записуються у текстурну пам'ять або назад у буфер кадру.

Складання текстур

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

Деякі реалізації OpenGL можуть мати спеціальні ресурси для прискорення текстурних операцій. Може бути присутня спеціалізована, високопродуктивна текстурна пам'ять. Якщо дана пам'ять доступна, текстурні об'єкти можуть мати пріоритет для управління цим обмеженим і цінним ресурсом.

Растеризація

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

Фрагментні операції

Перед тим, як значення зберігаються у буфер кадру, виконуються серії операцій, які можуть змінювати чи навіть відкидати фрагменти. Усі ці операції можуть бути увімкненими чи вимкненими.

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

Оригінал

http://www.glprogramming.com/red/chapter01.html