OpenGL

OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трехмерную компьютерную графику. OpenGL Включает более 250-ти функций для рисования сложных трехмерных сцен из простых примитивов. Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. Под Windows конкурирует с DirectX.

Спецификация
На базовом уровне, OpenGL — это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации — библиотеки функций, соответствующих набору функций спецификации. Реализация использует возможности оборудования, там где это возможно. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests — тесты на соответствие), прежде чем реализация будет официально классифицирована. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.
Эффективные реализации OpenGL на сегодняшний день существуют для платформ Windows, Unix, Mac OS, а также PlayStation 3. Эти реализации обычно предоставляются изготовителями видеоадаптеров и активно используют возможности последних. Существуют также чисто программные реализации спецификации OpenGL, одной из которых является библиотека Mesa. С точки зрения лицензионности, Mesa является неофициальной реализацией OpenGL, хотя полностью с ней совместима на уровне кода.
Авторами оригинальной спецификации являются Курт Экелей и Марк Сегал. Версию 1.1 редактировал Крис Фрэзиер, версии с 1.2 по 2.0 - Йон Лич.

Архитектура
OpenGL ориентируется на следующие две задачи:
- скрыть сложности адаптации различных 3D-ускорителей, предоставляя разработчику единый API;
- скрыть различия в возможностях аппаратных платформ, компенсируя недостающие функции при помощи программной эмуляции.
Основным принципом работы OpenGL является получение наборов векторных графических примитивов в виде точек, линий и многоугольников с последующей математической обработкой полученных данных и построением растровой картинки на экране и/или в памяти. Векторные трансформации и растеризация выполняются графическим конвейером (pipeline), который представляет из себя дискретный автомат. Абсолютное большинство команд OpenGL попадают в одну из двух групп: либо они добавляют графические примитивы на вход в конвейер, либо конфигурируют конвейер на различное исполнение трансформаций.
OpenGL является низкоуровневым, процедурным API, что вынуждает программиста диктовать точную последовательность шагов, чтобы построить результирующую растровую графику (императивный подход). Это является основным отличием от дескрипторных подходов, когда вся сцена передается в виде структуры данных (чаще всего дерева), которое обрабатывается и строится на экране. С одной стороны императивный подход требует от программиста глубокого знания законов трёхмерной графики и математических моделей, с другой стороны даёт свободу внедрения различных инноваций.

Расширения
Стандарт OpenGL с появлением новых технологий позволяет отдельным производителям повышать функциональность библиотеки через механизм расширений. Расширения распространяются с помощью двух составляющих: заголовочный файл, в котором находятся прототипы новых функций и констант, а также драйвер устройства, поставляемого разработчиком. Каждый производитель имеет аббревиатуру, которая используется при именовании его новых функций и констант. Например, компания nVidia имеет аббревиатуру NV, которая используется при именовании ее новых функций, как, например, glCombinerParameterfvNV, а также констант: GL_NORMAL_MAP_NV. Может случиться так, что определенное расширение могут реализовать несколько производителей. В этом случае используется аббревиатура EXT, например, glDeleteRenderbuffersEXT. В случае же, когда расширение одобряется консорциумом ARB, оно приобретает аббревиатуру ARB и становится стандартным расширением. Обычно расширения, одобренные консорциумом, включаются в одну из последующих спецификаций OpenGL.

Дополнительные библиотеки
Существует ряд библиотек, созданных поверх или в дополнение к OpenGL. Например, библиотека GLU, являющаяся практически стандартным дополнением OpenGL и всегда её сопровождающая, построена поверх последней, то есть использует её функции для реализации своих возможностей. Другие библиотеки, как, например, GLUT и SDL, созданы для реализации возможностей, недоступных в OpenGL. К таким возможностям относятся создание интерфейса пользователя (окна, кнопки, меню и др.), настройка контекста рисования (область рисования, использующаяся OpenGL), обработка сообщений от устройств ввода/вывода (клавиатура, мышь и др.), а также работа с файлами. Обычно, каждый оконный менеджер имеет собственную библиотеку-расширение для реализации вышеописанных возможностей, например, WGL в Windows или GLX в X Window System, однако библиотеки GLUT и SDL являются кросс-платформенными, что облегчает перенос написанных приложений на другие платформы. Такие библиотеки, как GLEW и GLEE, созданы для облегчения работы с расширениями и различными версиями OpenGL.
OpenGL имеет только набор геометрических примитивов (точки, линии, многоугольники) из которых создаются все трехмерные объекты. Порой подобный уровень детализации не всегда удобен при создании сцен. Поэтому поверх OpenGL были созданы более высокоуровневые библиотеки, такие как Open Inventor и VTK. Данные библиотеки позволяют оперировать более сложными трехмерными объектами, что облегчает и ускоряет создание трехмерной сцены.

Независимость от языка программирования
Для подтверждения независимости от языка программирования были разработаны различные варианты привязки функций OpenGL. Одним из примеров может служить библиотека Java 3D, которая может использовать аппаратное ускорение OpenGL. Прямая привязка функций реализована в Lightweight Java Game Library, которая имеет прямую привязку OpenGL для Java. Sun также выпустила версию JOGL, которая предоставляет прямую привязку к C-функциям OpenGL, в отличие от Java 3D, которая не имеет столь низкоуровневой поддержки. Официальный сайт OpenGL имеет ссылки на привязки для языков Java, Fortran 90, Perl, Pike, Python, Ada и Visual Basic. Имеются также варианты привязки OpenGL для языков C++ и C#.

История
Сегодня компьютерная графика нашла широкое распространение и применение в повседневной жизни. Ученые используют компьютерную графику для анализа результатов моделирования. Инженеры и архитекторы используют трехмерную графику для создания виртуальных моделей. Кинематографы создают удивительные спецэффекты или полностью анимированные фильмы. Широкое распространение получили также компьютерные игры, максимально использующие трехмерную графику для создания виртуальных миров.

Распространению компьютерной графики сопутствовали свои трудности. 17 лет назад разработка программного продукта, способного работать на большом количестве графического оборудования было сопряжено с большими временными и финансовыми затратами. Необходимо было отдельно создавать модули для каждого типа графических адаптеров, что порой приводило к большой дупликации исходного кода. Это сильно тормозило развитие и распространение компьютерной графики.

История OpenGL берет свое начало в далеком 1982 году. Именно тогда в Стэнфордском университете была разработана концепция графической машины, на основе которой знаменитая фирма Silicon Graphics Inc. в своей рабочей станции Silicon IRIS реализовала конвейер рендеринга. Silicon Graphics специализировалась на создании высокотехнологического графического оборудования и программных средств и была в то время лидером в трехмерной графике. Как лидер, она чаще сталкивалась и с барьерами в росте рынка, вызванными в первую очередь большими временными и финансовыми затратами на разработку программ, способных работать на различном графическом оборудовании. Поэтому было принято решение стандартизировать метод доступа к графической аппаратуре на уровне программного интерфейса. Так была разработана графическая библиотека IRIS GL, ставшая предтечей OpenGL. Одним из ограничений IRIS GL было то, что она позволяла использовать только возможности, поддерживаемые оборудованием; если возможность не была реализована аппаратно, приложение не могло её использовать. Именно на основе библиотеки IRIS GL в 1992 году был разработан и утверждён графический стандарт OpenGL, где GL означает Graphics Library, а Open намекает на его открытость и мобильность. Проблему своего предшественника OpenGL преодолел за счёт программной реализации возможностей, не предоставляемых аппаратно, что позволяет приложениям использовать этот интерфейс на относительно маломощных системах.

Тогда же был создан консорциум компаний, поддерживающих новый стандарт, который получил название ARB (Architecture Review Board). Именно он уже долгие годы определяет развитие этого графического API, пересматривая его спецификации по мере необходимости. В ARB кроме Silicon Graphics Inc., вошло множество крупных корпораций, таких как, IBM Corporation, Sun Microsystems Inc., Digital Equipment Corporation (DEC), Evans & Sutherland, Hewlett-Packard Corporation, Intel Corporation и Intergraph Corporation. Даже Microsoft приложила руку к новому графическому стандарту, та самая Microsoft, которая через несколько лет, в 1995 году, выпустит на рынок первую версию DirectX, будущего главного конкурента OpenGL. Microsoft вышла из состава ARB в 2003 году, зато сейчас в консорциум входят все крупные производители видеокарт, включая AMD и nVIDIA.

Изначально созданный для профессионального сектора, OpenGL очень прочно обосновался в нем. Он использовался на высокопроизводительных рабочих станциях, в научной сфере, в образовании, а также в проектах, где требуется переносимость приложений на различные программные или аппаратные платформы. К тому времени, как ARB обратили внимание на бурно развивающийся игровой сектор, выяснилось, что у OpenGL появились серьезные конкуренты. На рынке игровых видеоускорителей бал правила компания 3DFX, создавшая в 1994 году первый полноценный API для игровых нужд — Glide. Поддерживал он, естественно, только чипсеты производства самой компании, что позволило ей на несколько лет стать практически монополистом на рынке игрового 3D. Закрытость API сыграла с 3DFX злую шутку — когда в 1996 году на игровом рынке появился OpenGL, его встретили с распростертыми объятиями. Впрочем, достойной конкуренции поначалу он составить не сумел — игры все равно писались под Glide.

Тем временем у OpenGL появился еще один соперник — корпорация Microsoft взялась за разработку API, который принадлежал бы только ей. В 1995 году компания выпустила первую версию DirectX, называвшуюся тогда Games SDK и работающую только под Windows. Впрочем, порт OpenGL для систем под управлением Windows тоже существовал, вот только работал он куда хуже и медленнее чем «родной» Direct3D. Получилось так вовсе не из-за преимущества API от Microsoft, а по причинам скорее политическим. Порт, реализованный программистами корпорации Гейтса, работал через медленный программный порт MCD, а не через быстрый ICD (Installable Client Driver). Сделано это было, разумеется, с прицелом на то, что разработчики игр будут работать с Direct3D, а не с OpenGL, уступающим ему в быстродействии. Поначалу так и было, но вскоре появился ICD-порт, разработанный компанией Silicon Graphics, а потом и многие производители акселераторов стали включать в комплект драйверов собственные версии ICD-портов, позволяющие наиболее эффективно использовать все возможности ускорения, которые предоставляет тот или иной 3D-набор микросхем. Кроме того, производители могли свободно добавлять в порты ICD новые, не предусмотренные в OpenGL функции, что обеспечивало расширение списка функций этой библиотеки и появление ее модификаций. Почувствовав, что теряет контроль над событиями, Microsoft решила прекратить войну стандартов и предложил SGI разработать единый API. Проект получил название Fahrenheit, и работа началась. Между делом, Microsoft потребовала убрать из Интернета все ссылки на SGI-реализацию OpenGL, и прекратить его дальнейшую поддержку, что и было сделано. Увы, но API Fahrenheit не суждено было появиться на свет. Microsoft, преследуя свои выгоды, решила реализовать новый API только через Direct3D, и сотрудничества не вышло. За OpenGL-часть проекта отвечала SGI, но компания переживала не лучшие времена, специалисты уходили в nVidia, так что энтузиазма у представителей SGI не было. Так бы и помер OpenGL тихо и незаметно, не получи он мощную поддержку со стороны Джона Кармака. Id Software избрали в качестве графического интерфейса для своей игры Quake именно OpenGL, что явилось спасением для последнего. Игра имела большой успех, вскоре стали появляться продолжения и модификации — WinQuake, GLQuake, Quake 2. Графический движок Quake стал популярен, начали выходить игры использующие его, а, следовательно, и OpenGL. Стандарт выжил, большая гонка продолжилась.

Говорили, что главной проблемой OpenGL, по сравнению с DirectX, является консорциум, в который входит большое количество компаний с различными интересами, что приводит к длительному периоду принятия новой версии спецификации. OpenGL версии 2.0 была представлена 3DLabs в ответ на беспокойства относительно медленного развития и нечеткого направления OpenGL. 3DLabs предложила ряд существенных дополнений к стандарту, наиболее значимым из которого было добавление к ядру OpenGL шейдерного языка GLSL (OpenGL Shading Language). Это позволяет программисту заменить фиксированный конвейер OpenGL небольшими программами на специальном высокоуровневом языке для создания различных эффектов, таких как bump mapping, paralax mapping, HDR и т.д. Поддержку GLSL включает в себя финальная версия спецификации OpenGL 2.0. Однако, еще до введения GLSL, существовала возможность разрабатывать спецэффекты на ассемблере (расширения GL_ARG_vertex_program и GL_ARB_fragment_program) и Cg (NVidia C for Graphics).

Консорциум же, определяющий направление развития OpenGL, успел много раз сменить состав, и сейчас в него входят AMD, Apple, Creative Labs, Intel, id Software, NVIDIA, Sony Computer Entertainment, Sun Microsystems и Texas Instruments. Помимо постоянных членов, каждый год приглашается большое количество других компаний, становящихся частью ARB в течение одного года.

В 2008 г. Khronos Group выпустила спецификацию OpenGL 3.0, включавшая поддержку GLSL 1.3, представила объекты Vertex Array Objects, массивы текстур, более гибкие FBO и ряд других графических функций. Чего не было в OpenGL 3.0, так это серьёзного пересмотра API, ожидаемого многими разработчиками, и ставшего доступным лишь много месяцев спустя.

24 марта 2009 года Khronos Group анонсировала OpenGL 3.1. В новой версии произведена чистка компонентов, которые были объявлены устаревшими, но оставались в OpenGL 3.0 для сглаживания перехода на новую версию API (устаревшие компоненты возможно в дальнейшем использовать через расширение GL_ARB_compatibility). Кроме того, в OpenGL 3.1 добавлен ряд новшеств, таких, как поддержка GLSL версии 1.4, буфер копирования, текстурные буферные объекты и т.д.

Большая гонка продолжается уже почти 15 лет, и сколько она еще продлится неизвестно. Но OpenGL, несмотря на то, что постоянно отстает на полшага, упрямо не сходит с дистанции. И не сойдет, если не случится качественного скачка, каким в свое время стал он сам. Открытость, независимость от оборудования и языка программирования, кроссплатформенность и механизмы расширений — вот то, что удерживает его на плаву все эти годы.


Ссылки по статье