OpenGL ( Открытая графическая библиотека [3] ) — это межъязыковой кроссплатформенный интерфейс прикладного программирования (API) для рендеринга 2D и 3D векторной графики . API обычно используется для взаимодействия с графическим процессором (GPU) для достижения аппаратного ускорения рендеринга .
Silicon Graphics, Inc. (SGI) начала разработку OpenGL в 1991 году и выпустила ее 30 июня 1992 года. [4] [5] Он используется для множества приложений, включая системы автоматизированного проектирования (САПР), видеоигры , научные исследования. визуализация , виртуальная реальность и моделирование полета . С 2006 года OpenGL находится под управлением некоммерческого технологического консорциума Khronos Group . [6]
Спецификация OpenGL описывает абстрактный интерфейс прикладного программирования (API) для рисования 2D- и 3D-графики. Он предназначен для реализации в основном или полностью с использованием аппаратного ускорения, такого как графический процессор , хотя API может быть полностью реализован в программном обеспечении, работающем на центральном процессоре .
API определяется как набор функций , которые могут вызываться клиентской программой, а также набор именованных целочисленных констант (например, константа GL_TEXTURE_2D, которая соответствует десятичному числу 3553). Хотя определения функций внешне похожи на определения в языке программирования C , они не зависят от языка. Таким образом, OpenGL имеет множество языковых привязок , некоторые из наиболее примечательных из которых — привязка JavaScript WebGL (API, основанный на OpenGL ES 2.0 , для 3D-рендеринга из веб-браузера ); привязки C WGL , GLX и CGL ; привязка C, предоставляемая iOS ; и привязки Java и C, предоставляемые Android .
OpenGL не только не зависит от языка, но и является кроссплатформенным. В спецификации ничего не говорится о получении контекста OpenGL и управлении им, оставляя это как деталь базовой оконной системы . По той же причине OpenGL занимается исключительно рендерингом, не предоставляя API-интерфейсов, связанных с вводом, звуком или обработкой окон.
OpenGL больше не находится в активной разработке: тогда как в период с 2001 по 2014 год спецификация OpenGL обновлялась в основном ежегодно: два выпуска (3.1 и 3.2) вышли в 2009 году и три (3.3, 4.0 и 4.1) в 2010 году, новейшая версия OpenGL Спецификация 4.6 была выпущена в 2017 году после трехлетнего перерыва и ограничивалась включением одиннадцати существующих расширений ARB и EXT в основной профиль. [7]
Активная разработка OpenGL была прекращена в пользу API Vulkan , выпущенного в 2016 году и имевшего кодовое название glNext во время первоначальной разработки. В 2017 году Khronos Group объявила, что OpenGL ES не будет иметь новых версий [8] и с тех пор сосредоточилась на разработке Vulkan и других технологий. [9] [10] В результате некоторые возможности современных графических процессоров, например трассировка лучей , не поддерживаются OpenGL.
Новые версии спецификаций OpenGL выпускаются Khronos Group , каждая из которых расширяет API для поддержки различных новых функций. Детали каждой версии определяются консенсусом между членами группы, включая производителей видеокарт, разработчиков операционных систем и общие технологические компании, такие как Mozilla и Google . [11]
В дополнение к функциям, требуемым основным API, поставщики графических процессоров (GPU) могут предоставлять дополнительные функции в виде расширений . Расширения могут добавлять новые функции и новые константы, а также ослаблять или снимать ограничения на существующие функции OpenGL. Поставщики могут использовать расширения для предоставления пользовательских API без необходимости поддержки со стороны других поставщиков или группы Khronos в целом, что значительно повышает гибкость OpenGL. Все расширения собираются и определяются в реестре OpenGL. [12]
Каждому расширению присвоен короткий идентификатор, основанный на названии компании, которая его разработала. Например, идентификатор Nvidia — NV, который является частью имени расширения GL_NV_half_float
, константы GL_HALF_FLOAT_NV
и функции glVertex2hNV()
. [13] Если несколько поставщиков соглашаются реализовать одну и ту же функциональность с использованием одного и того же API, может быть выпущено общее расширение с использованием идентификатора EXT. В таких случаях также может случиться так, что Совет по обзору архитектуры группы Khronos даст расширение свое явное одобрение, и в этом случае будет использоваться идентификатор ARB. [14]
Функции, представленные в каждой новой версии OpenGL, обычно формируются из комбинации функций нескольких широко реализованных расширений, особенно расширений типа ARB или EXT.
Совет по обзору архитектуры OpenGL выпустил серию руководств вместе со спецификацией, которые были обновлены для отслеживания изменений в API. Их обычно называют по цветам их обложек:
Исторические книги (до OpenGL 2.0):
Документация OpenGL также доступна через официальную веб-страницу. [15]
Самые ранние версии OpenGL были выпущены с сопутствующей библиотекой под названием OpenGL Utility Library (GLU). Он предоставлял простые и полезные функции, которые вряд ли поддерживались современным оборудованием, такие как тесселяция , генерация MIP-карт и примитивных форм . Спецификация GLU последний раз обновлялась в 1998 году и зависит от функций OpenGL, которые сейчас устарели .
Учитывая, что создание контекста OpenGL — довольно сложный процесс, и учитывая, что он варьируется в зависимости от операционной системы , автоматическое создание контекста OpenGL стало общей функцией нескольких библиотек разработки игр и пользовательских интерфейсов , включая SDL , Allegro , SFML , FLTK , и Qt . Несколько библиотек были разработаны исключительно для создания окон с поддержкой OpenGL. Первой такой библиотекой была OpenGL Utility Toolkit (GLUT), позже замененная freeglut . GLFW — более новая альтернатива. [16]
Учитывая высокую рабочую нагрузку, связанную с идентификацией и загрузкой расширений OpenGL, было разработано несколько библиотек, которые автоматически загружают все доступные расширения и функции. Примеры включают библиотеку OpenGL Easy Extension (GLEE), библиотеку OpenGL Extension Wrangler (GLEW) и glbinding . Расширения также автоматически загружаются большинством языковых привязок, таких как JOGL и PyOpenGL.
glxinfo
, показывающий информацию о реализации OpenGL в системе Mesa.Mesa 3D — это реализация OpenGL с открытым исходным кодом . Он может выполнять чистый программный рендеринг, а также может использовать аппаратное ускорение на BSD , Linux и других платформах, воспользовавшись преимуществами инфраструктуры прямого рендеринга . Начиная с версии 20.0, он реализует версию 4.6 стандарта OpenGL.
В 1980-х годах разработка программного обеспечения, которое могло бы работать с широким спектром графического оборудования, была настоящей проблемой. Разработчики программного обеспечения написали собственные интерфейсы и драйверы для каждого оборудования. Это было дорого и привело к увеличению усилий.
К началу 1990-х годов компания Silicon Graphics (SGI) была лидером в области 3D-графики для рабочих станций. Их IRIS GL API [18] [19] стал отраслевым стандартом и использовался более широко, чем основанный на открытых стандартах PHIGS . [ нужна цитация ] Это произошло потому, что IRIS GL считался более простым в использовании, [ кем? ] и потому, что он поддерживает немедленный рендеринг. PHIGS, напротив, считался сложным в использовании и устаревшим по функциональности.
Конкуренты SGI (включая Sun Microsystems , Hewlett-Packard и IBM ) также смогли вывести на рынок 3D-оборудование, поддерживаемое расширениями стандарта PHIGS, что вынудило SGI открыть исходный код версии IRIS GL в качестве общедоступного стандарта под названием OpenGL .
Однако у SGI было много клиентов, для которых переход с IRIS GL на OpenGL потребовал бы значительных инвестиций. Более того, в IRIS GL были функции API, не имеющие отношения к 3D-графике. Например, он включал API управления окнами, клавиатурой и мышью, отчасти потому, что он был разработан до X Window System и Sun NeWS . И библиотеки IRIS GL были непригодны для открытия из-за проблем с лицензированием и патентами [ нужны дальнейшие объяснения ] . Эти факторы требовали от SGI продолжения поддержки передовых и запатентованных API-интерфейсов программирования Iris Inventor и Iris Performer, в то время как рыночная поддержка OpenGL созревала.
Одним из ограничений IRIS GL было то, что он предоставлял доступ только к функциям, поддерживаемым базовым оборудованием. Если графическое оборудование не поддерживает функцию изначально, приложение не сможет ее использовать. OpenGL преодолел эту проблему, предоставив программную реализацию функций, не поддерживаемых аппаратным обеспечением, что позволило приложениям использовать расширенную графику в относительно маломощных системах. OpenGL стандартизировал доступ к оборудованию, возложил ответственность за разработку программ аппаратного интерфейса ( драйверов устройств ) на производителей оборудования и делегировал функции управления окнами базовой операционной системе. При таком большом количестве различных типов графического оборудования возможность говорить на одном языке оказала замечательное влияние, предоставив разработчикам программного обеспечения платформу более высокого уровня для разработки 3D-программ.
В 1992 году [20] SGI возглавил создание Совета по обзору архитектуры OpenGL (OpenGL ARB), группы компаний, которые будут поддерживать и расширять спецификацию OpenGL в будущем.
В 1994 году SGI задумалась о выпуске чего-то под названием « OpenGL++ », которое включало бы такие элементы, как API-интерфейс графа сцены (предположительно основанный на их технологии Performer ). Спецификация была распространена среди нескольких заинтересованных сторон, но так и не стала продуктом. [21]
В 1996 году Microsoft выпустила Direct3D , который со временем стал главным конкурентом OpenGL. Более 50 разработчиков игр подписали открытое письмо Microsoft, опубликованное 12 июня 1997 года, с призывом к компании активно поддерживать OpenGL. [22] 17 декабря 1997 года [23] Microsoft и SGI инициировали проект «Фаренгейт» , который представлял собой совместную работу с целью унификации интерфейсов OpenGL и Direct3D (а также добавления API графов сцен). В 1998 году к проекту присоединилась Hewlett-Packard. [24] Первоначально он подавал некоторые надежды на наведение порядка в мире API-интерфейсов интерактивной 3D-компьютерной графики, но из-за финансовых ограничений SGI, стратегических соображений Microsoft и общего отсутствия поддержки со стороны отрасли от него отказались в 1999 году . 25]
В июле 2006 года Совет по обзору архитектуры OpenGL проголосовал за передачу контроля над стандартом OpenGL API группе Khronos. [26] [27]
В июне 2018 года Apple объявила устаревшими API OpenGL на всех своих платформах ( iOS , macOS и tvOS ), настоятельно поощряя разработчиков использовать свой собственный Metal API , который был представлен в 2014 году. [28]
id Software использовала OpenGL в своих играх, начиная с GLQuake (порт Quake на OpenGL с некоторыми модификациями), выпущенного в 1997 году. [29] Первым лицензированным движком компании с поддержкой OpenGL был движок Quake II , также известный как id Tech 2 . [30] В 2016 году они выпустили обновление для id Tech 6 , в котором добавлена поддержка Vulkan, преемника OpenGL. В ID Tech 7 исключена поддержка OpenGL. [31]
В марте 2023 года Valve удалила поддержку OpenGL из Dota 2 . [32]
Khronos прекратил поддержку в OpenGL ряда современных графических технологий, например Ray Tracing , декодирования видео на GPU , алгоритма сглаживания с глубоким обучением — AMD FidelityFX Super Resolution(FSR) [33] [34] и Nvidia DLSS. [35] [36]
Atypen Games при поддержке Samsung обновили свой игровой движок, чтобы использовать Vulkan вместо OpenGL на всех платформах, отличных от Apple. [37]
ОС Google Fuchsia использует Vulkan в качестве встроенного графического API и требует совместимого с Vulkan графического процессора. Fuchsia намерена поддерживать OpenGL поверх Vulkan посредством слоя трансляции ANGLE. [38]
Первая версия OpenGL, версия 1.0, была выпущена 30 июня 1992 года Марком Сигалом и Куртом Экли . С тех пор OpenGL время от времени расширялся путем выпуска новой версии спецификации. Такие выпуски определяют базовый набор функций, которые должны поддерживать все соответствующие видеокарты и на основе которых можно легче писать новые расширения. Каждая новая версия OpenGL обычно включает в себя несколько расширений, которые широко поддерживаются производителями видеокарт, хотя детали этих расширений могут быть изменены.
Дата выхода : 7 сентября 2004 г.
OpenGL 2.0 изначально был задуман 3Dlabs для устранения опасений, что OpenGL находится в застое и ему не хватает четкого направления. [55] 3Dlabs предложила ряд важных дополнений к стандарту. Большинство из них в то время были отклонены ARB или по каким-либо причинам так и не были реализованы в той форме, которую предложила 3Dlabs. Однако их предложение по языку шейдеров в стиле C в конечном итоге было завершено, в результате чего появилась текущая формулировка языка шейдеров OpenGL ( GLSL или GLslang). Как и ассемблерные языки шейдеров, которые он заменял, он позволял заменять вершины с фиксированной функцией и фрагментный канал шейдерами , хотя на этот раз написанными на C-подобном языке высокого уровня.
Конструкция GLSL отличалась относительно небольшими уступками ограничениям доступного на тот момент оборудования. Это отсылало к более ранней традиции OpenGL, ставившей амбициозную и дальновидную цель для 3D-ускорителей, а не просто отслеживание состояния доступного в настоящее время оборудования. Окончательная спецификация OpenGL 2.0 [56] включает поддержку GLSL.
До выпуска OpenGL 3.0 новая редакция имела кодовое название Longs Peak . На момент первоначального анонса Longs Peak был представлен как первая крупная версия API за всю историю OpenGL. Он заключался в пересмотре способа работы OpenGL и внесении фундаментальных изменений в API.
В проекте внесены изменения в управление объектами. Объектная модель GL 2.1 была построена на основе архитектуры OpenGL, основанной на состояниях. То есть, чтобы изменить объект или использовать его, необходимо привязать объект к системе состояний, затем внести изменения в состояние или выполнить вызовы функций, использующих привязанный объект.
Поскольку OpenGL использует систему состояний, объекты должны быть изменяемыми. То есть базовая структура объекта может измениться в любой момент, даже если конвейер рендеринга асинхронно использует этот объект. Объект текстуры можно переопределить из 2D в 3D. Это требует, чтобы любые реализации OpenGL усложняли внутреннее управление объектами.
В API Longs Peak создание объектов станет атомарным , с использованием шаблонов для определения свойств объекта, который будет создан с помощью одного вызова функции. Затем объект можно было сразу использовать в нескольких потоках. Объекты также будут неизменяемыми; однако их содержимое может быть изменено и обновлено. Например, текстура может изменить свое изображение, но ее размер и формат изменить нельзя.
Для поддержки обратной совместимости старый API на основе состояния по-прежнему будет доступен, но никакие новые функции не будут предоставляться через старый API в более поздних версиях OpenGL. Это позволило бы продолжать работу устаревших кодовых баз, таких как большинство продуктов САПР , в то время как другое программное обеспечение можно было бы писать с использованием нового API или портировать на него.
Первоначально Longs Peak должен был быть завершен в сентябре 2007 года под названием OpenGL 3.0, но 30 октября Khronos Group объявила, что столкнулась с несколькими проблемами, которые хотела бы решить перед выпуском спецификации. [57] В результате выпуск спецификации был отложен, и Khronos Group отключилась от СМИ до выпуска окончательной версии OpenGL 3.0.
Окончательная спецификация оказалась гораздо менее революционной, чем предложение Longs Peak. Вместо удаления всех немедленных режимов и фиксированных функций (режим без шейдеров) спецификация включила их как устаревшие функции. Предложенная объектная модель не была включена, и о планах включать ее в будущие версии не сообщалось. В результате API остался практически прежним, а некоторые существующие расширения были повышены до основных функций.
В некоторых группах разработчиков это решение вызвало бурю негодования, [58] многие разработчики заявили, что перейдут на DirectX в знак протеста. Большинство жалоб касалось отсутствия связи Khronos с сообществом разработчиков и отказа от множества функций, которые многие воспринимали положительно. Другие разочарования включали требование к аппаратному обеспечению уровня DirectX 10 использовать OpenGL 3.0, а также отсутствие геометрических шейдеров и экземплярного рендеринга в качестве основных функций.
Другие источники сообщили, что реакция сообщества была не такой серьезной, как первоначально предполагалось, [59] при этом многие поставщики продемонстрировали поддержку обновления. [60] [61]
Дата выхода : 11 августа 2008 г.
В OpenGL 3.0 введен механизм прекращения поддержки для упрощения будущих версий API. Некоторые функции, помеченные как устаревшие, можно полностью отключить, запросив у оконной системы контекст прямой совместимости . Однако доступ к функциям OpenGL 3.0 по-прежнему можно получить наряду с этими устаревшими функциями, запросив полный контекст .
Устаревшие функции включают в себя:
Дата выхода : 24 марта 2009 г.
В OpenGL 3.1 полностью удалены все функции, устаревшие в версии 3.0, за исключением широких линий. Начиная с этой версии, невозможно получить доступ к новым функциям с использованием полного контекста или получить доступ к устаревшим функциям с использованием контекста с прямой совместимостью . Исключение из первого правила делается, если реализация поддерживает расширение ARB_compatibility, но это не гарантируется.
Аппаратная поддержка: Mesa поддерживает ARM Panfrost версии 21.0.
Дата выхода : 3 августа 2009 г.
OpenGL 3.2 в дальнейшем развивает механизмы устаревания, представленные в OpenGL 3.0, путем разделения спецификации на основной профиль и профиль совместимости . Контексты совместимости включают ранее удаленные API с фиксированными функциями, эквивалентные расширению ARB_compatibility, выпущенному вместе с OpenGL 3.1, тогда как основные контексты этого не делают. OpenGL 3.2 также включал обновление до GLSL версии 1.50.
Дата выхода: 11 марта 2010 г.
Mesa поддерживает программный драйвер SWR, softpipe и старые карты Nvidia с NV50.
Дата выхода : 11 марта 2010 г.
OpenGL 4.0 был выпущен вместе с версией 3.3. Он был разработан для оборудования, поддерживающего Direct3D 11.
Как и OpenGL 3.0, эта версия OpenGL содержит большое количество довольно несущественных расширений, предназначенных для полного раскрытия возможностей оборудования класса Direct3D 11. Ниже перечислены только наиболее влиятельные расширения.
Аппаратная поддержка: Nvidia GeForce серии 400 и новее, AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Ivy Bridge и новее. [62]
Дата выхода : 26 июля 2010 г.
Аппаратная поддержка: Nvidia GeForce серии 400 и новее, AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Ivy Bridge и новее. [62]
Дата выхода: 8 августа 2011 г. [49]
Аппаратная поддержка: Nvidia GeForce серии 400 и новее, AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale) и Intel HD Graphics в процессорах Intel Haswell и новее. [62] (Linux Mesa: Ivy Bridge и новее)
Дата выхода: 6 августа 2012 г. [50]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Haswell и новее. [62] (Linux Mesa: Ivy Bridge без трафаретного текстурирования, Haswell и новее), Nvidia GeForce серии 400 и новее. Эмуляция VIRGL для виртуальных машин поддерживает версии 4.3+ с Mesa 20.
Дата выхода: 22 июля 2013 г. [52]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Broadwell и новее (Linux Mesa: Haswell и новее), [64] Nvidia GeForce 400 серии и новее, [65] Тегра К1 .
Дата выхода: 11 августа 2014 г. [12] [53]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Broadwell и новее (Linux Mesa: Haswell и новее), Nvidia GeForce серии 400 и новее, [65] Тегра К1 и Тегра Х1. [67] [68]
Дата выхода: 31 июля 2017 г. [12] [7] [54]
Аппаратная поддержка: AMD Radeon HD серии 7000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel Haswell и новее, Nvidia GeForce серии 400 и новее. [65]
Поддержка драйверов:
Apple отказалась от OpenGL в iOS 12 и macOS 10.14 Mojave в пользу Metal , но он по-прежнему доступен в macOS 13 Ventura (включая кремниевые устройства Apple ). [76] Последняя поддерживаемая версия OpenGL — 4.1 от 2011 года. [77] [78] Собственная библиотека от Molten — авторов MoltenVK — под названием MoltenGL, может транслировать вызовы OpenGL в Metal. [79]
Есть несколько проектов, которые пытаются реализовать OpenGL поверх Vulkan. Серверная часть Vulkan для Google ANGLE достигла соответствия OpenGL ES 3.1 в июле 2020 года. [80] Проект Mesa3D также включает такой драйвер под названием Zink . [81]
В Windows 11 от Microsoft на Arm добавлена поддержка OpenGL 3.3 через GLon12, реализацию OpenGL с открытым исходным кодом поверх DirectX 12 через Mesa Gallium . [82] [83] [84]
Vulkan, ранее называвшийся «Инициативой OpenGL следующего поколения» (glNext), [85] [86] представляет собой попытку унифицировать OpenGL и OpenGL ES в один общий API, который не будет обратно совместим с существующими версиями OpenGL. [87] [88] [89]
Первоначальная версия Vulkan API была выпущена 16 февраля 2016 года.