opengl

OpenGL

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

На базовом уровне, OpenGL - это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации - библиотеки функций, соответствующих набору функций спецификации. Реализация использует возможности оборудования, там где это возможно. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Аппаратные реализации OpenGL на сегодняшний день существуют для платформ Windows, Unix (Linux, BSD, OSX), PlayStation 3, Android и др. Эти реализации обычно предоставляются изготовителями видеокарт и активно используют возможности последних. Существуют также чисто программные реализации OpenGL.

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

OpenGL ориентируется на следующие две задачи:

  • скрыть сложности архитектуры 3D-ускорителя, предоставляя разработчику удобный API;
  • скрыть различия в возможностях ускорителей, компенсируя недостающие функции при помощи программной эмуляции.

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

OpenGL является низкоуровневым, процедурным API, что вынуждает программиста диктовать точную последовательность шагов, чтобы построить результирующую растровую графику (императивный подход). Это является основным отличием от дескрипторных подходов, когда вся сцена передается в виде структуры данных (чаще всего дерева), которое обрабатывается и строится на экране. С одной стороны императивный подход требует от программиста глубокого знания законов трехмерной графики и математических моделей, с другой стороны дает свободу внедрения различных инноваций.

История 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-портов, позволяющие наиболее эффективно использовать все возможности ускорения, которые предоставляет та или иная видеокарта. Кроме того, производители могли свободно добавлять в порты ICD новые, не предусмотренные в OpenGL функции, что обеспечивало расширение списка функций этой библиотеки и появление ее модификаций. Почувствовав, что теряет контроль над событиями, Microsoft решила прекратить войну стандартов и предложила SGI разработать единый API. Проект получил название Fahrenheit, и работа началась. Между делом, Microsoft потребовала убрать из Интернета все ссылки на SGI-реализацию OpenGL, и прекратить его дальнейшую поддержку, что и было сделано. Увы, но API Fahrenheit не суждено было появиться на свет. Microsoft, преследуя свои выгоды, решила реализовать новый API только через Direct3D, и сотрудничества не вышло. За OpenGL-часть проекта отвечала SGI, но компания переживала не лучшие времена, специалисты уходили в nVidia, так что энтузиазма у представителей SGI не было. Так бы и помер OpenGL тихо и незаметно, не получи он мощную поддержку со стороны Джона Кармака. Id Software избрали в качестве графического интерфейса для своей игры Quake именно OpenGL, что явилось спасением для последнего. Игра имела большой успех, вскоре стали появляться модификации и продолжения. Графический движок 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, однако еще до этого существовала возможность разрабатывать спецэффекты на ассемблере (расширения 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, буфер копирования, текстурные буферные объекты и т.д.

11 марта 2010 г. ARB утвердил спецификацию OpenGL 4.0. Среди нововведений можно отметить расширенную интеграцию с OpenCL (Open Computing Language), многопоточный рендеринг, обновление GLSL до версии 4.0, поддержку 64-х битных операции с плавающей точкой, а также многочисленные улучшения производительности.

26 июля 2010 года вышла OpenGL 4.1. Спецификация включает в себя обновление GLSL до версии 4.10, а также поддержку сохранения и загрузки бинарных скомпилированных вариантов шейдерных программ.

9 августа 2011 г. организация Khronos Group представила OpenGL 4.2 и язык описания шейдеров GLSL 4.20.

В 2012 году Khronos Group отметила 20-й юбилей OpenGL, представив OpenGL 4.3. В этой версии дебютировали вычислительные шейдеры, которые позволяют использовать GPU для задач неграфического характера, а также буферные объекты данных, которые можно передавать между шейдерами.

В 2013 году был представлен OpenGL 4.4, который включает инструменты для работы с видеопамятью, поддержку асинхронности, а также средства для упрощения портирования приложений с Direct3D 11.

OpenGL 4.5, вышедший в 2014 году, поддерживает новый метод доступа к состоянию объектов в видеопамяти, позволяющего опросить и изменить состояние без привязки объектов к контекстам.

В 2017 году вышел OpenGL 4.6, в котором появилась поддержка SPIR-V - промежуточного представления шейдеров, а также анизотропной фильтрации текстур.

  • opengl.txt
  • Последнее изменение: 2021/03/15 12:24
  • (внешнее изменение)