Введение
Кроссплатформенный графический API
OpenGL (Open Graphics Library) используется в широком спектре приложений, включая системы автоматизированного проектирования (CAD), видеоигры, научную визуализацию, виртуальную реальность и авиационные симуляторы. С 2006 года OpenGL поддерживается некоммерческим технологическим консорциумом Khronos Group.
Дизайн
Спецификация 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 в основной профиль. С тех пор разработка сосредоточена на Vulkan и других технологиях. В результате некоторые возможности, предлагаемые современными графическими процессорами, например, трассировка лучей, не поддерживаются OpenGL. Новые версии спецификаций OpenGL выпускаются консорциумом Khronos, каждая из которых расширяет API для поддержки различных новых функций. Детали каждой версии определяются на основе консенсуса между членами консорциума, включая производителей графических карт, разработчиков операционных систем и технологические компании, такие как Mozilla и Google. Помимо функций, требуемых основным API, производители графических процессоров (GPU) могут предоставлять дополнительную функциональность в виде расширений. Расширения могут вводить новые функции и константы, а также ослаблять или снимать ограничения с существующих функций OpenGL. Производители могут использовать расширения для предоставления собственных API без необходимости поддержки со стороны других производителей или консорциума Khronos в целом, что значительно повышает гибкость OpenGL. Все расширения собраны и определены в реестре OpenGL (OpenGL Registry). Каждое расширение имеет короткий идентификатор, основанный на названии компании, разработавшей его. Например, идентификатор Nvidia — NV, который является частью имени расширения GL_NV_half_float, константы GL_HALF_FLOAT_NV и функции glVertex2hNV. Если несколько производителей соглашаются реализовать одну и ту же функциональность, используя один и тот же API, может быть выпущено общее расширение с идентификатором EXT. В таких случаях возможно и явное одобрение расширения Архитектурным советом консорциума Khronos, в этом случае используется идентификатор ARB. Функции, вводимые каждой новой версией OpenGL, обычно формируются из объединенных функций нескольких широко реализованных расширений, особенно расширений типов ARB или EXT.
Связанные библиотеки
Самые ранние версии OpenGL выпускались вместе с сопроводительной библиотекой под названием OpenGL Utility Library (GLU). Она предоставляла простые и полезные функции, которые вряд ли поддерживались современным оборудованием, такие как тесселяция, генерация мип-карт и примитивных фигур. Спецификация GLU была в последний раз обновлена в 1998 году и зависит от функций OpenGL, которые теперь считаются устаревшими.
Загрузка библиотек расширений
Учитывая высокую нагрузку, связанную с определением и загрузкой расширений OpenGL, было разработано несколько библиотек, которые автоматически загружают все доступные расширения и функции. К ним относятся библиотека OpenGL Easy Extension (GLEE), библиотека OpenGL Extension Wrangler (GLEW) и glbinding. Большинство языковых привязок, таких как JOGL и PyOpenGL, также автоматически загружают расширения.
Реализация
Mesa 3D — это реализация OpenGL с открытым исходным кодом. Она способна выполнять программный рендеринг и может использовать аппаратное ускорение на BSD, Linux и других платформах посредством Direct Rendering Infrastructure. По состоянию на версию 20.0, она реализует версию 4.6 стандарта OpenGL.
История
В 1980-х годах разработка программного обеспечения, способного работать с широким спектром графического оборудования, была серьезной проблемой. Разработчики программного обеспечения писали собственные интерфейсы и драйверы для каждого устройства. Это было дорогостоящим и приводило к дублированию усилий. К началу 1990-х годов Silicon Graphics (SGI) стала лидером в области 3D-графики для рабочих станций. Их API IRIS GL стал отраслевым стандартом, получившим более широкое распространение, чем открытые стандарты 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's NeWS. Кроме того, библиотеки IRIS GL не подходили для открытия из-за лицензионных и патентных ограничений. Эти факторы вынудили SGI продолжать поддержку передовых и проприетарных API программирования Iris Inventor и Iris Performer, пока рыночная поддержка OpenGL не созрела. Одним из ограничений IRIS GL было то, что он предоставлял доступ только к функциям, поддерживаемым базовым оборудованием. Если графическое оборудование не поддерживало функцию аппаратно, то приложение не могло ее использовать. OpenGL решила эту проблему, предоставив программные реализации функций, не поддерживаемых оборудованием, что позволило приложениям использовать передовую графику на относительно маломощных системах. OpenGL стандартизировал доступ к оборудованию, переложил ответственность за разработку программ интерфейса оборудования (драйверов устройств) на производителей оборудования и делегировал функции управления окнами базовой операционной системе. Благодаря такому разнообразию графического оборудования, обеспечение их взаимодействия на едином языке оказало значительное влияние, предоставив разработчикам программного обеспечения платформу более высокого уровня для разработки 3D-приложений. В 1992 году SGI возглавила создание OpenGL Architecture Review Board (OpenGL ARB) – группы компаний, которая в будущем должна была поддерживать и расширять спецификацию OpenGL. В 1994 году SGI рассматривала возможность выпуска продукта под названием "OpenGL++", который должен был включать такие элементы, как API графа сцен (предположительно, основанный на их технологии Performer). Спецификация была распространена среди нескольких заинтересованных сторон, но так и не была превращена в продукт. В 1996 году Microsoft выпустила Direct3D, которая в конечном итоге стала основным конкурентом OpenGL. Более 50 разработчиков игр подписали открытое письмо в Microsoft, опубликованное 12 июня 1997 года, с призывом к компании активно поддерживать OpenGL. 17 декабря 1997 года Microsoft и SGI инициировали проект Fahrenheit, представлявший собой совместную работу, направленную на объединение интерфейсов OpenGL и Direct3D (а также добавление API графа сцен). В 1998 году к проекту присоединилась Hewlett Packard. Первоначально он демонстрировал определенные перспективы по упорядочиванию мира интерактивных 3D-графических API, но из-за финансовых ограничений в SGI, стратегических соображений в Microsoft и общей нехватки поддержки отрасли он был прекращен в 1999 году. В июле 2006 года OpenGL Architecture Review Board проголосовала за передачу контроля над стандартом OpenGL API группе Khronos.
Поддержка промышленности
В июне 2018 года Apple прекратила поддержку OpenGL API на всех своих платформах (iOS, macOS и tvOS), настоятельно рекомендуя разработчикам использовать свой проприетарный Metal API, представленный в 2014 году. id Software начала использовать OpenGL в своих играх с GLQuake (порт Quake на OpenGL с некоторыми изменениями), выпущенной в 1997 году. Первым лицензированным движком компании с поддержкой OpenGL был движок Quake II, также известный как id Tech 2. В 2016 году они выпустили обновление для id Tech 6, добавив поддержку Vulkan, преемника OpenGL. ID Tech 7 отказалась от поддержки OpenGL. В марте 2023 года Valve удалила поддержку OpenGL из Dota 2. Khronos прекратила поддержку OpenGL для ряда современных графических технологий, таких как трассировка лучей (Ray Tracing), видеодекодирование на GPU, алгоритм сглаживания с использованием глубокого обучения – AMD FidelityFX Super Resolution (FSR) и Nvidia DLSS. Atypical Games, при поддержке Samsung, обновила свой игровой движок, перейдя на Vulkan вместо OpenGL, на всех платформах, кроме Apple. Операционная система Fuchsia от Google использует Vulkan в качестве нативного графического API и требует GPU, совместимого с Vulkan. Fuchsia планирует поддерживать OpenGL поверх Vulkan посредством ANGLE – слоя трансляции.
id Software has been using OpenGL in their games starting with GLQuake (port of Quake to OpenGL with a few modifications) released in 1997. The company's first licensed engine with OpenGL support was Quake II engine, also known as id Tech 2. In 2016, they released an update for the id Tech 6 that added support for Vulkan, a successor to OpenGL. ID Tech 7 eliminated support for OpenGL. In March 2023, Valve removed OpenGL support from Dota 2. Khronos has stopped providing support in OpenGL for a number of modern graphics technologies, e. g. Ray Tracing, video decoding on GPU, anti aliasing algorithm with deep learning – AMD FidelityFX Super Resolution(FSR) and Nvidia DLSS. Atypical Games, with support from Samsung, updated their game engine to use Vulkan, rather than OpenGL, across all non Apple platforms. Google's Fuchsia OS uses Vulkan as the native graphics API and requires a Vulkan conformant GPU. Fuchsia intends to support OpenGL on top of Vulkan by means of ANGLE translation layer.
Альтернативные варианты реализации
Apple отказалась от OpenGL в iOS 12 и macOS 10.14 Mojave в пользу Metal, но она остаётся доступной по состоянию на macOS 14 Sonoma (включая устройства Apple Silicon). Последняя поддерживаемая версия OpenGL – 4.1, выпущенная в 2011 году. Проприетарная библиотека MoltenGL, разработанная компанией Molten – авторами MoltenVK – способна транслировать вызовы OpenGL в Metal. Существует несколько проектов, пытающихся реализовать OpenGL поверх Vulkan. Бэкенд Vulkan для Google ANGLE достиг соответствия OpenGL ES 3.1 в июле 2020 года. Проект Mesa3D также включает в себя подобный драйвер под названием Zink. Microsoft Windows 11 на Arm добавила поддержку OpenGL 3.3 посредством GLon12 – реализации OpenGL с открытым исходным кодом, работающей поверх DirectX 12 через Mesa Gallium.
Вулкан
Vulkan, ранее известная как "Инициатива OpenGL следующего поколения" (glNext), – это полная переработка, направленная на объединение OpenGL и OpenGL ES в единый общий API, не обеспечивающий обратную совместимость с существующими версиями OpenGL. Первая версия API Vulkan была выпущена 16 февраля 2016 года.