OpenGL

OpenGL
ТипГрафічне 3D API
АвторSilicon Graphics
РозробникиKhronos Group
Перший випуск30 червня 1992; 32 роки тому (1992-06-30)
Стабільний випуск4.6 (31 липня 2017; 7 років тому (2017-07-31))
Операційна системакрос-платформовий
Мова програмуванняC і GLSL
Стан розробкине підтримується, заміщений Vulkan
Ліцензіярізні
Вебсайтwww.opengl.org

OpenGL — (англ. Open Graphics Library — відкрита графічна бібліотека) — специфікація, що визначає незалежний від мови програмування крос-платформовий програмний інтерфейс (API) для написання застосунків, що використовують 2D та 3D комп'ютерну графіку. Цей інтерфейс містить понад 250 функцій, які можуть використовуватися для малювання складних тривимірних сцен з простих примітивів. Широко застосовується індустрією комп'ютерних ігор і віртуальної реальності, у графічних інтерфейсах (Compiz, Clutter), при візуалізації наукових даних, в системах автоматизованого проектування тощо.

Історія

Стандарт OpenGL був розроблений і затверджений у 1992 році передовими компаніями в області розробки апаратного та програмного забезпечення для роботи з комп'ютерною графікою. Метою співпраці було створення апаратно-незалежного інтерфейсу придатного для реалізації на різних платформах. Основою стандарту стала бібліотека IRIS GL, розроблена компанією Silicon Graphics.

У 1994 році SGI пограла з ідеєю випустити щось під назвою «OpenGL++», що включало такі елементи, як API графів сцени (ймовірно, на основі їхньої технології Performer). Специфікація була поширена серед кількох зацікавлених сторін, але так і не перетворилася на продукт.[1]

Курт Акелей (Kurt Akeley) і Марк Сіґал (Mark Segal) створили оригінальну специфікацію OpenGL. Кріс Фразаєр (Chris Frazier) редагував версію 1.1, а Джон Ліч (Jon Leech) версії з 1.2 по 2.0.

31 липня 2006 року на SIGGRAPH було анонсовано, що контроль за специфікацією OpenGL буде переданий Khronos Group[2]. У серпні 2008 Khronos Group опублікував специфікацію OpenGL 3.0[3].

Специфікація

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

Ефективні реалізації OpenGL існують для операційних систем Linux, MacOS, Microsoft Windows та багатьох UNIX-подібних ОС, а також для таких ігрових боксів, як Sony PlayStation 3. Різні програмні реалізації OpenGL існують для платформ, виробники яких не підтримують дану специфікацію. Відкрита (open source) бібліотека Mesa — повністю OpenGL сумісний програмний API. Однак, для того, щоб уникнути витрат на ліцензування, пов'язаних з формалізацією, яка вимагається для офіційного визнання реалізації, Mesa є неофіційною реалізацією специфікації, хоча й повністю з нею сумісна.

Архітектура

OpenGL орієнтується на такі два завдання:

  1. Сховати складності адаптації різних 3D-прискорювачів, надаючи розробнику єдиний API.
  2. Приховати відмінності в можливостях апаратних платформ, вимагаючи реалізації відсутньої функціональності за допомогою програмної емуляції.

Основним принципом роботи OpenGL є отримання наборів векторних графічних примітивів у вигляді точок, ліній та багатокутників з наступною математичною обробкою отриманих даних та побудовою растрової картинки на екрані і/або в пам'яті. Векторні трансформації та растеризація виконуються графічним конвеєром (graphics pipeline), який власне являє собою дискретний автомат. Абсолютна більшість команд OpenGL потрапляють в одну з двох груп: або вони додають графічні примітиви на вхід в конвеєр, або конфігурують конвеєр на різне виконання трансформацій.

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

Розширення

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

Кожен виробник має абревіатуру, яка використовується при іменуванні його нових функцій і констант. Для прикладу, компанія NVIDIA має абревіатуру NV, яка використовується в змінній GL_NV_half_float, константі GL_HALF_FLOAT_NV та функції glVertex2hNV()[4]. Може трапитися так, що певне розширення можуть реалізовувати декілька виробників. У цьому випадку, використовується абревіатура EXT, наприклад, glDeleteRenderbuffersEXT. У разі ж, коли розширення схвалюється консорціумом ARB, воно набуває абревіатури ARB і стає стандартним.[5] Зазвичай, розширення, схвалені консорціумом ARB включаються до однієї з наступних специфікацій OpenGL.

Список специфікацій розширень можна знайти тут [Архівовано 8 січня 2017 у Wayback Machine.].

Додаткові

Існує ряд бібліотек, створених поверх або на додаток до OpenGL. Наприклад, бібліотека GLU, що є практично стандартним доповненням OpenGL і завжди її супроводжує, побудована поверх останньої, тобто використовує її функції для реалізації своїх можливостей. Інші бібліотеки, як, наприклад, GLUT і SDL, створені для реалізації можливостей, недоступних в OpenGL. До таких можливостей належать створення інтерфейсу користувача (вікна, кнопки, меню та ін.), настройка контексту малювання (область малювання, яку використовує OpenGL), обробка повідомлень від пристроїв введення/виведення (клавіатура, миша та ін.), а також робота з файлами. Зазвичай, кожний віконний менеджер має власну бібліотеку-розширення для реалізації вищеописаних можливостей, наприклад, WGL в Windows або GLX в X Window System, однак бібліотеки GLUT і SDL є крос-платформеними, що полегшує перенесення написаних додатків на інші платформи. Бібліотеки GLEW (The OpenGL Extension Wrangler Library) і GLEE (The OpenGL Easy Extension library) створені для полегшення роботи з розширеннями та різними версіями OpenGL. Це особливо актуально для програмістів в Windows, оскільки заголовні та бібліотечні файли, що поставляються з Visual Studio, знаходяться на рівні версії OpenGL 1.1. OpenGL має лише набір геометричних примітивів (точки, лінії, багатокутники) з яких створюються всі тривимірні об'єкти. Часом подібний рівень деталізації не завжди зручний при створенні сцен. Тому поверх OpenGL були створені вищорівневі бібліотеки, такі як Open Inventor і VTK. Дані бібліотеки дозволяють оперувати більш складними тривимірними об'єктами, що полегшує та прискорює створення тривимірної сцени. GLM (OpenGL Mathematics) — Допоміжна бібліотека, що надає програмістам на C++ класи та функції для виконання математичних операцій. Бібліотека може використовуватися при створенні 3D-програм з використанням OpenGL.[2] Однією з характеристик GLM є те, що реалізація заснована на специфікації GLSL. Вихідний код GLM використовує ліцензію MIT.

Незалежність від мови програмування

Для підтвердження незалежності від мови програмування були розроблені різні варіанти прив'язки (binding) функцій OpenGL або повністю перенесені на інші мови. Одним із прикладів може служити бібліотека Java 3D, яка може використовувати апаратне прискорення OpenGL. Пряма прив'язка функцій реалізована в Lightweight Java Game Library[3], Яка має пряму прив'язку OpenGL для Java. Sun також випустила версію Java OpenGL (JOGL), яка надає пряму прив'язку до Сі-функцій OpenGL, на відміну від Java 3D, яка не має настільки низькорівневої підтримки. Офіційний сайт OpenGL має посилання на прив'язки для мов Java, Фортран 90, Perl, Pike, Python, Ada, Visual Basic і Pascal.[4] Є також варіанти прив'язки OpenGL для мов C++ і C#.[5]

OpenGL 2.0

У порівнянні із DirectX стверджувалось, що основною проблемою OpenGL є Консорціум, в який входить велика кількість компаній із різними інтересами, що призводить до довгого періоду прийняття нової версії специфікації. OpenGL версії 2.0 був представлений 3Dlabs у відповідь на хвилювання відносно повільного розвитку і нечіткого направлення OpenGL. Компанія 3Dlabs запропонувала ряд суттєвих доповнень до стандарту, найбільш значимим із яких було додавання до ядра OpenGL шейдерної мови програмування GLSL (OpenGL Shading Language). Це дозволило програмістам замінити фіксований конвеєр OpenGL невеликими шейдерними програмами на спеціальній шейдерній мові для створення різних візуальних ефектів, таких як bump mapping, normal mapping, paralax mapping, HDR і т.д.

Ще до введення в стандарт OpenGL мови GLSL існувала можливість розробляти спецефекти на асемблерних мовах (розширення vertex_program, fragment_program) специфічних для виробника (ATI, Nvidia) і на шейдерній мові Cg (NVidia C for Graphics) від компанії NVidia.

OpenGL 3.0

Специфікація OpenGL 3.0 додає великий обсяг нової функціональності. OpenGL 3.0 включає нову версію мови програмування шейдерів GLSL 1.30, а також забезпечує всебічну підтримку сучасних програмованих графічних рішень. Крім того, робоча група визначила набір розширень OpenGL 3.0, які дозволять додати нову функціональність в наступну версію OpenGL. Серед основних особливостей OpenGL 3.0 — масиви текстур, 32-бітовий буфер глибини з рухомою комою, нові режими стиснення текстур і інше.

У розробці специфікації OpenGL 3.0 брали активну участь фахівці компаній AMD, Intel і nVidia. За оцінками аналітиків компанії Jon Peddie Research, встановлена база графічного устаткування з підтримкою OpenGL 3.0 перевищує 60 мільйонів пристроїв.

OpenGL 4.0

11 березня 2010 року Khronos Group представила фінальний варіант специфікації OpenGL 4.0 і мови опису шейдерів GLSL 4.0. OpenGL 4.0 повністю сумісний назад із старими розширеннями OpenGL, використовуючи режим сумісності введений в OpenGL 3.2[6].

Нововведення[7]

  • Два нові ступені обробки шейдерів, що дозволяє перенести обробку теселяції з центрального процесора на GPU;
  • Підтримка вибіркових фрагментних шейдерів (per-sample fragment shaders) і програмованих фрагментних шейдерів вхідних позицій для збільшення якості рендерінга і гнучкості в управлінні згладжуванням;
  • Промальовування даних, що згенеровані OpenGL або такими зовнішніми API, як OpenCL, без участі центрального процесора;
  • Шейдерні підпрограми допоможуть значно збільшити гнучкість написання програм;
  • Розділення стану текстур і текстурованих даних через додавання нового типу даних під назвою «об'єкти семплів»;
  • 64-бітова подвійна точність з рухомою комою операцій з шейдерами і введенням-виведення для збільшення точності і якості рендерінга;
  • Збільшення продуктивності, включаючи шейдери геометрії зразка, масивів зразка і нових запитів до таймера.

Проект

OpenGL обслуговує дві цілі:

  • Для того, щоб приховувати складнощі встановлення зв'язку комп'ютера з різними 3D відеоприскорювачами, надати програмістові один, загальноприйнятий API
  • Для того, щоб приховати можливості базових інструментальних машин, які відрізняються своїм намаганням виконати підтримку повного набору особливостей OpenGL (використання програмної емуляції, якщо необхідно).

Приклад

//Для початку очистимо буфер, в якому зберігається колір, щоб розпочати роботу з чистого полотна:
glClear( GL_COLOR_BUFFER_BIT );
//Тепер встановимо modelview матрицю, яка управляє позицією камери щодо примітивів. Переміщуємо її на 3 позиції уздовж осі z:
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0, 0, -3 );
//Матриця проекту управляє перспективним ефектом, прикладеним до примітивів, і управляється подібно до modelview матриці:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -1, 1, -1, 1, 1, 1000 );
//Нарешті, ми випускаємо багатокутник - зелений, рівно орієнтований на XY осі:
glBegin( GL_POLYGON );
glColor3f( 0, 1, 0 );
glVertex3f( -1, -1, 0 );
glVertex3f( -1, 1, 0 );
glVertex3f( 1, 1, 0 );
glVertex3f( 1, -1, 0 );
glEnd();

Документація

Значною мірою популярність OpenGL пов'язана з наявністю великої кількості якісної документації.

OpenGL ARB випустила ряд посібників разом із специфікацією, яку було оновлено для відображення змін в API. Це майже універсальні посібники, відомі, як кольорові:

Підручники з OpenGL 2.0 та пізніших версій:

Виноски

  1. OpenGL ARB Meeting Notes - March 9-10, 1998. www.opengl.org. Процитовано 27 липня 2022.
  2. Khronos Press Release: OpenGL ARB to Pass Control of OpenGL Specification to Khronos Group [Архівовано 3 травня 2008 у Wayback Machine.]
  3. Khronos Releases OpenGL 3.0 Specifications to Support Latest Generations of Programmable Graphics Hardware. Архів оригіналу за 13 серпня 2008. Процитовано 12 серпня 2008.
  4. Архівована копія. Архів оригіналу за 6 січня 2014. Процитовано 8 січня 2014.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  5. How to Create Khronos API Extensions. Opengl.org. 13 серпня 2006. Архів оригіналу за 15 квітня 2013. Процитовано 7 листопада 2012.
  6. Khronos Unleashes Cutting-Edge, Cross-Platform Graphics Acceleration with OpenGL 4.0. Khronos Press Releases. 11 березня 2010. Архів оригіналу за 25 серпня 2011. Процитовано 11 березня 2010.
  7. Обзор новшеств OpenGL 4.0 на OpenNet. Архів оригіналу за 24 червня 2013. Процитовано 12 березня 2010.

Дивись також

Ресурси тенет