OpenGL ( Open Graphics Library [4] ) — кросс-языковой , кросс-платформенный интерфейс прикладного программирования (API) для рендеринга 2D и 3D векторной графики . API обычно используется для взаимодействия с графическим процессором (GPU) для достижения аппаратного ускорения рендеринга .
Silicon Graphics, Inc. (SGI) начала разрабатывать OpenGL в 1991 году и выпустила его 30 июня 1992 года. [5] [6] Он используется для различных приложений, включая автоматизированное проектирование (САПР), видеоигры , научную визуализацию , виртуальную реальность и моделирование полетов . С 2006 года OpenGL управляется некоммерческим технологическим консорциумом Khronos Group . [7]
Спецификация OpenGL описывает абстрактный интерфейс прикладного программирования (API) для рисования 2D и 3D графики. Он разработан для реализации в основном или полностью с использованием аппаратного ускорения, такого как GPU , хотя API может быть реализован полностью в программном обеспечении, работающем на CPU .
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 в основной профиль. [8]
Активная разработка OpenGL была прекращена в пользу API Vulkan , выпущенного в 2016 году и имевшего кодовое название glNext во время первоначальной разработки. В 2017 году Khronos Group объявила, что OpenGL ES не будет иметь новых версий [9] и с тех пор сосредоточилась на разработке Vulkan и других технологий. [10] [11] В результате некоторые возможности, предлагаемые современными графическими процессорами, например трассировка лучей , не поддерживаются стандартом OpenGL. Однако поддержка новых функций может быть предоставлена через расширения OpenGL, специфичные для поставщика. [12] [13]
Группа Khronos выпускает новые версии спецификаций OpenGL, каждая из которых расширяет API для поддержки различных новых функций. Детали каждой версии определяются консенсусом между членами группы, включая производителей видеокарт, разработчиков операционных систем и общие технологические компании, такие как Mozilla и Google . [14]
В дополнение к функциям, требуемым основным API, поставщики графических процессоров (GPU) могут предоставлять дополнительную функциональность в виде расширений . Расширения могут вводить новые функции и новые константы, а также могут ослаблять или снимать ограничения на существующие функции OpenGL. Поставщики могут использовать расширения для предоставления пользовательских API без необходимости поддержки со стороны других поставщиков или Khronos Group в целом, что значительно увеличивает гибкость OpenGL. Все расширения собираются и определяются в реестре OpenGL. [15]
Каждое расширение связано с коротким идентификатором, основанным на названии компании, которая его разработала. Например, идентификатор Nvidia — NV, который является частью имени расширения ,GL_NV_half_float
константы GL_HALF_FLOAT_NV
и функции glVertex2hNV()
. [16] Если несколько поставщиков соглашаются реализовать одну и ту же функциональность с использованием одного и того же API, может быть выпущено общее расширение с использованием идентификатора EXT. В таких случаях также может случиться, что Совет по рассмотрению архитектуры Khronos Group даст расширению свое явное одобрение, и в этом случае будет использоваться идентификатор ARB. [17]
Функции, вводимые каждой новой версией OpenGL, обычно формируются из объединенных функций нескольких широко распространенных расширений, особенно расширений типа ARB или EXT.
The OpenGL Architecture Review Board выпустила серию руководств вместе со спецификацией, которые были обновлены для отслеживания изменений в API. Обычно их называют по цветам обложек:
Исторические книги (до OpenGL 2.0):
Документация OpenGL также доступна на официальной веб-странице. [18]
Самые ранние версии OpenGL были выпущены с сопутствующей библиотекой, называемой OpenGL Utility Library (GLU). Она предоставляла простые, полезные функции, которые вряд ли поддерживались современным оборудованием, такие как тесселяция и генерация mip-карт и примитивных фигур . Спецификация GLU последний раз обновлялась в 1998 году и зависит от функций OpenGL, которые в настоящее время устарели .
Учитывая, что создание контекста OpenGL является довольно сложным процессом, и учитывая, что он различается в разных операционных системах , автоматическое создание контекста OpenGL стало общей чертой нескольких библиотек разработки игр и пользовательского интерфейса , включая SDL , Allegro , SFML , FLTK и Qt . Несколько библиотек были разработаны исключительно для создания окна с поддержкой OpenGL. Первой такой библиотекой была OpenGL Utility Toolkit (GLUT), позже замененная freeglut . GLFW является более новой альтернативой. [19]
Учитывая высокую нагрузку, связанную с идентификацией и загрузкой расширений OpenGL, было разработано несколько библиотек, которые автоматически загружают все доступные расширения и функции. Примерами являются OpenGL Easy Extension library (GLEE), OpenGL Extension Wrangler Library (GLEW) и glbinding . Расширения также автоматически загружаются большинством языковых привязок, таких как JOGL и PyOpenGL.
Mesa 3D — это реализация OpenGL с открытым исходным кодом . Она может выполнять чисто программный рендеринг, а также может использовать аппаратное ускорение на BSD , Linux и других платформах, используя преимущества инфраструктуры прямого рендеринга . Начиная с версии 20.0, она реализует версию 4.6 стандарта OpenGL.
В 1980-х годах разработка программного обеспечения, которое могло бы работать с широким спектром графического оборудования, была настоящим вызовом. Разработчики программного обеспечения писали собственные интерфейсы и драйверы для каждого вида оборудования. Это было дорого и приводило к умножению усилий.
К началу 1990-х годов Silicon Graphics (SGI) была лидером в области 3D-графики для рабочих станций. Их IRIS GL API [21] [22] стал отраслевым стандартом, используемым более широко, чем основанный на открытых стандартах 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 и NeWS от Sun. И библиотеки IRIS GL были непригодны для открытия из-за проблем с лицензированием и патентами [ необходимо дополнительное объяснение ] . Эти факторы требовали от SGI продолжать поддерживать передовые и фирменные программные API Iris Inventor и Iris Performer , пока рыночная поддержка OpenGL не созрела.
Одним из ограничений IRIS GL было то, что он предоставлял доступ только к функциям, поддерживаемым базовым оборудованием. Если графическое оборудование изначально не поддерживало функцию, то приложение не могло ее использовать. OpenGL преодолел эту проблему, предоставив программные реализации функций, не поддерживаемых оборудованием, что позволило приложениям использовать расширенную графику на относительно маломощных системах. OpenGL стандартизировал доступ к оборудованию, переложил ответственность за разработку программ интерфейса оборудования ( драйверов устройств ) на производителей оборудования и делегировал функции управления окнами базовой операционной системе. При таком количестве различных видов графического оборудования заставить их всех говорить на одном языке таким образом имело замечательное влияние, предоставив разработчикам программного обеспечения платформу более высокого уровня для разработки 3D-программ.
В 1992 году [23] компания SGI возглавила создание Совета по рассмотрению архитектуры OpenGL (OpenGL ARB) — группы компаний, которая в будущем будет поддерживать и расширять спецификацию OpenGL.
В 1994 году SGI играла с идеей выпустить что-то под названием " OpenGL++ ", которое включало такие элементы, как API графа сцены (предположительно, основанный на их технологии Performer ). Спецификация была распространена среди нескольких заинтересованных сторон, но так и не превратилась в продукт. [24]
В 1996 году Microsoft выпустила Direct3D , который в конечном итоге стал главным конкурентом OpenGL. Более 50 разработчиков игр подписали открытое письмо Microsoft, опубликованное 12 июня 1997 года, призывая компанию активно поддерживать OpenGL. [25] 17 декабря 1997 года [26] Microsoft и SGI инициировали проект Fahrenheit , который был совместным усилием с целью объединения интерфейсов OpenGL и Direct3D (а также добавления API графа сцены). В 1998 году к проекту присоединилась Hewlett-Packard. [27] Первоначально он показывал некоторые перспективы наведения порядка в мире интерактивных API трехмерной компьютерной графики, но из-за финансовых ограничений в SGI, стратегических причин в Microsoft и общего отсутствия поддержки отрасли он был заброшен в 1999 году. [28]
В июле 2006 года Совет по рассмотрению архитектуры OpenGL проголосовал за передачу контроля над стандартом API OpenGL группе Khronos. [29] [30]
В июне 2018 года Apple объявила устаревшими API OpenGL на всех своих платформах ( iOS , macOS и tvOS ), настоятельно рекомендовав разработчикам использовать свой собственный API Metal , представленный в 2014 году. [31]
id Software использует OpenGL в своих играх, начиная с GLQuake (порт Quake на OpenGL с несколькими модификациями), выпущенного в 1997 году. [32] Первым лицензированным движком компании с поддержкой OpenGL был движок Quake II , также известный как id Tech 2. [ 33] В 2016 году они выпустили обновление для id Tech 6 , которое добавило поддержку Vulkan, преемника OpenGL. ID Tech 7 исключил поддержку OpenGL. [34]
В марте 2023 года Valve удалила поддержку OpenGL из Dota 2. [ 35]
Khronos прекратил поддержку в OpenGL ряда современных графических технологий, например, трассировки лучей , декодирования видео на GPU , алгоритма сглаживания с глубоким обучением – AMD FidelityFX Super Resolution(FSR) [36] [37] и Nvidia DLSS. [38] [39]
Atypical Games при поддержке Samsung обновили свой игровой движок, чтобы использовать Vulkan вместо OpenGL на всех платформах, отличных от Apple. [40]
Fuchsia OS от Google использует Vulkan в качестве собственного графического API и требует Vulkan-совместимого GPU. Fuchsia намерена поддерживать OpenGL поверх Vulkan посредством слоя трансляции ANGLE. [41]
Первая версия OpenGL, версия 1.0, была выпущена 30 июня 1992 года Марком Сигалом и Куртом Экли . С тех пор OpenGL время от времени расширялся путем выпуска новой версии спецификации. Такие выпуски определяют базовый набор функций, которые должны поддерживать все соответствующие графические карты, и на основе которых можно легче писать новые расширения. Каждая новая версия OpenGL имеет тенденцию включать несколько расширений, которые имеют широкую поддержку среди поставщиков графических карт, хотя детали этих расширений могут быть изменены.
Дата выпуска : 7 сентября 2004 г.
OpenGL 2.0 изначально был задуман 3Dlabs для решения проблем, связанных с тем, что OpenGL стагнирует и не имеет четкого направления. [59] 3Dlabs предложили ряд важных дополнений к стандарту. Большинство из них в то время были отклонены ARB или иным образом никогда не были реализованы в форме, предложенной 3Dlabs. Однако их предложение о языке шейдеров в стиле C в конечном итоге было завершено, что привело к текущей формулировке языка шейдеров OpenGL ( GLSL или GLslang). Как и языки шейдеров, подобные ассемблеру, которые он заменял, он позволял заменить фиксированный конвейер вершин и фрагментов на шейдеры , хотя на этот раз написанные на языке высокого уровня, подобном C.
Дизайн GLSL был примечателен тем, что делал относительно немного уступок ограничениям доступного тогда оборудования. Это возвращало к более ранней традиции OpenGL, устанавливающей амбициозную, перспективную цель для 3D-ускорителей, а не просто отслеживающей состояние доступного в настоящее время оборудования. Окончательная спецификация OpenGL 2.0 [60] включает поддержку 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. Это позволило бы устаревшим кодовым базам, таким как большинство продуктов CAD , продолжать работать, в то время как другое программное обеспечение могло бы быть написано или перенесено на новый API.
Первоначально Longs Peak должен был быть завершен в сентябре 2007 года под названием OpenGL 3.0, но 30 октября Khronos Group объявила, что столкнулась с несколькими проблемами, которые она хотела бы решить до выпуска спецификации. [61] В результате спецификация была отложена, и Khronos Group ушла в медиа-затишье до выпуска финальной спецификации OpenGL 3.0.
Окончательная спецификация оказалась гораздо менее революционной, чем предложение Longs Peak. Вместо того, чтобы удалить весь немедленный режим и фиксированную функциональность (нешейдерный режим), спецификация включила их в качестве устаревших функций. Предложенная объектная модель не была включена, и не было объявлено о планах включить ее в какие-либо будущие пересмотры. В результате API остался в основном тем же, а несколько существующих расширений были повышены до основных функций. Среди некоторых групп разработчиков это решение вызвало некоторый переполох, [62] многие разработчики заявили, что перейдут на DirectX в знак протеста. Большинство жалоб вращалось вокруг отсутствия коммуникации Khronos с сообществом разработчиков и отказа от множества функций, которые были восприняты многими благосклонно. Другие разочарования включали требование к оборудованию уровня DirectX 10 для использования OpenGL 3.0 и отсутствие геометрических шейдеров и рендеринга экземпляров в качестве основных функций.
Другие источники сообщили, что реакция сообщества была не столь серьезной, как изначально предполагалось, [63] и многие поставщики выразили поддержку обновлению. [64] [65]
Дата выпуска : 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 и новее. [66]
Дата выпуска : 26 июля 2010 г.
Аппаратная поддержка: Nvidia GeForce серии 400 и новее, AMD Radeon HD серии 5000 и новее (FP64-шейдеры, реализованные путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Ivy Bridge и новее. [66]
Дата выхода: 8 августа 2011 г. [53]
Аппаратная поддержка: Nvidia GeForce серии 400 и новее, AMD Radeon HD серии 5000 и новее (FP64-шейдеры, реализованные путем эмуляции на некоторых графических процессорах TeraScale), а также Intel HD Graphics в процессорах Intel Haswell и новее. [66] (Linux Mesa: Ivy Bridge и новее)
Дата выхода: 6 августа 2012 г. [54]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Haswell и новее. [66] (Linux Mesa: Ivy Bridge без трафаретного текстурирования, Haswell и новее), Nvidia GeForce серии 400 и новее. Эмуляция VIRGL для виртуальных машин поддерживает 4.3+ с Mesa 20.
Дата выхода: 22 июля 2013 г. [56]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Broadwell и новее (Linux Mesa: Haswell и новее), [68] Nvidia GeForce серии 400 и новее, [69] Tegra K1 .
Дата выхода: 11 августа 2014 г. [15] [57]
Аппаратная поддержка: AMD Radeon HD серии 5000 и новее (шейдеры FP64 реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel HD Graphics в процессорах Intel Broadwell и новее (Linux Mesa: Haswell и новее), Nvidia GeForce серии 400 и новее, [69] Tegra K1 и Tegra X1. [71] [72]
Дата выхода: 31 июля 2017 г. [15] [8] [58]
Аппаратная поддержка: AMD Radeon HD серии 7000 и новее (FP64-шейдеры реализованы путем эмуляции на некоторых графических процессорах TeraScale), Intel Haswell и новее, Nvidia GeForce серии 400 и новее. [69]
Поддержка драйверов:
Apple отказалась от OpenGL в iOS 12 и macOS 10.14 Mojave в пользу Metal , но он по-прежнему доступен с macOS 14 Sonoma (в том числе на устройствах Apple Silicon ). [80] Последняя поддерживаемая версия OpenGL — 4.1 от 2011 года. [81] [82] Собственная библиотека от Molten — авторов MoltenVK — под названием MoltenGL может транслировать вызовы OpenGL в Metal. [83]
Существует несколько проектов, которые пытаются реализовать OpenGL поверх Vulkan. Бэкэнд Vulkan для Google ANGLE достиг соответствия OpenGL ES 3.1 в июле 2020 года. [84] Проект Mesa3D также включает такой драйвер, называемый Zink . [85]
В Windows 11 на Arm от Microsoft добавлена поддержка OpenGL 3.3 через GLon12, реализацию OpenGL с открытым исходным кодом поверх DirectX 12 через Mesa Gallium . [86] [87] [88]
Vulkan, ранее называвшийся «Next Generation OpenGL Initiative» (glNext), [89] [90] представляет собой попытку полностью перепроектировать OpenGL и OpenGL ES в один общий API, который не будет обратно совместим с существующими версиями OpenGL. [91] [92] [93]
Первоначальная версия Vulkan API была выпущена 16 февраля 2016 года.