OpenGL

OpenGL - ( англ. Open G raphics L ibrary - Открытая графическая библиотека) - спецификация, определяющая независимый от языки программирования кросс-платформенный программный интерфейс ( API) для написания приложений, использующих 2D и 3D компьютерную графику. Этот интерфейс содержит более 250 функций, которые могут использоваться для рисования сложных трехмерных сцен из простых примитивов. Широко применяется индустрией компьютерных игр и виртуальной реальности, в графических интерфейсах ( Compiz, Clutter), при визуализации научных данных, в системах автоматизированного проектирования и т.д..


1. История

Стандарт OpenGL был разработан и утвержден в 1992 году передовыми компаниями в области разработки аппаратного и программного обеспечения для работы с компьютерной графикой. Целью сотрудничества было создание аппаратно-независимого интерфейса пригодного для реализации на различных платформах. Основой стандарта стала библиотека IRIS GL, разработанная компанией Silicon Graphics.

Курт Акела (Kurt Akeley) и Марк Сигал (Mark Segal) создали оригинальную спецификацию OpenGL. Крис Фразаер (Chris Frazier) редактировал версию 1.1, а Джон Лич (Jon Leech) версии с 1.2 по 2.0.

31 июля 2006 года на SIGGRAPH было анонсировано, что контроль по спецификации OpenGL будет передан Khronos Group [1]. В августе 2008 Khronos Group опубликовал спецификацию OpenGL 3.0 [2].


2. Спецификация

На базовом уровне, OpenGL - это всего лишь спецификация, то есть, это - просто документ, который описывает набор функций и их точное поведение. На основе этих спецификаций производители аппаратного обеспечения создают реализации - библиотеки функций, соответствующих заявленной в OpenGL спецификации. Эти реализации проектируются для того, чтобы по возможности использовать возможности аппаратного обеспечения. Когда аппаратное ускорение не допускается, выполнение функций осуществляется с помощью программного обеспечения. Производители должны пройти специальные тесты на соответствие, прежде, чем их реализацию классифицировать, как реализацию OpenGL. Таким образом, разработчикам программного обеспечения необходимо всего лишь научиться использовать описанные в спецификации функции, и оставить их реализацию за разработчиками аппаратного обеспечения.

Эффективные реализации OpenGL существуют для операционных систем Linux, MacOS X, Microsoft Windows и многих UNIX -подобных ОС, а также для таких игровых боксов, как Sony PlayStation 3. Различные программные реализации OpenGL существуют для платформ, производители которых не поддерживают данную спецификацию. Открытая ( open source) библиотека Mesa - полностью OpenGL совместимый программный API. Однако, для того, чтобы избежать затрат на лицензирование, связанных с формализацией, которая требуется для официального признания реализации, Mesa является неофициальной реализацией спецификации, хотя и полностью с ней совместима.


2.1. OpenGL 2.0

По сравнению с DirectX утверждалось, что основной проблемой OpenGL является Консорциум, в который входит большое количество компаний с различными интересами, что приводит к долгому периоду принятия новой версии спецификации. OpenGL версии 2.0 был представлен 3Dlabs в ответ на волнения относительно медленного развития и нечеткого направления OpenGL. Компания 3Dlabs предложила ряд существенных дополнений к стандарту, наиболее значимым из которых было добавление к ядру OpenGL шейдерной языка программирования GLSL (OpenGL Shading Language). Это позволило программистам заменить фиксированный конвейер OpenGL небольшими шейдерными программами на специальной шейдерного языке для создания различных визуальных эффектов, таких как bump mapping, normal mapping, paralax mapping, HDR и т.д.

Еще до введения в стандарт OpenGL языка GLSL существовала возможность разрабатывать спецэффекты на ассемблерных языках (расширение vertex_program, fragment_program) специфичных для производителя (Ati, Nvidia) и на шейдерный языке Cg (NVidia C for Graphics) от компании NVidia.


2.2. OpenGL 3.0

Спецификация OpenGL 3.0 добавляет большой объем новой функциональности. OpenGL 3.0 включает новую версию языка программирования шейдеров GLSL 1.30, а также обеспечивает всестороннюю поддержку современных программируемых графических решений. Кроме того, рабочая группа определила набор расширений OpenGL 3.0, которые позволят добавить новую функциональность в следующую версию OpenGL. Среди основных особенностей OpenGL 3.0 - массивы текстур, 32-битный буфер глубины с плавающей точкой, новые режимы сжатия текстур и другое.

В разработке спецификации OpenGL 3.0 принимали активное участие специалисты компаний AMD, Intel и nVidia. По оценкам аналитиков компании Jon Peddie Research, установленная база графического оборудования с поддержкой OpenGL 3.0 превышает 60 миллионов устройств.


2.3. OpenGL 4.0

11 марта 2010 года Khronos Group представила финальный вариант спецификации OpenGL 4.0 и языка описания шейдеров GLSL 4.0. OpenGL 4.0 полностью совместим назад со старыми расширениями OpenGL, используя режим совместимости введен в OpenGL 3.2 [3].

Нововведение [4]

  • Два новых степени обработки шейдеров, что позволяет перенести обработку тесселяцию с центрального процессора на GPU;
  • Поддержка выборочных фрагментных шейдеров (per-sample fragment shaders) и программируемых фрагментных шейдеров входных позиций для увеличения качества рендеринга и гибкости в управлении сглаживанием;
  • Прорисовка данных, сгенерированных OpenGL или такими внешними API, как OpenCL, без участия центрального процессора;
  • Шейдерные подпрограммы помогут значительно увеличить гибкость написания программ;
  • Разделение состояния текстур и текстурных данных через добавление нового типа данных под названием "объекты сэмплов";
  • 64-битная двойная точность с плавающей запятой операций с шейдерами и вводом-выводом для увеличения точности и качества рендеринга;
  • Увеличение производительности, включая шейдеры геометрии образца, массивов образца и новых запросов к таймеру.

3. Проект

OpenGL обслуживает две цели:

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

4. Пример

 / / Для начала очистим буфер, в котором хранится цвет, чтобы начать работу с чистого холста: glClear (GL_COLOR_BUFFER_BIT) / / Теперь установим modelview матрицу, которая управляет позицией камеры по примитивов. Перемещаем ее на 3 позиции вдоль оси z: glMatrixMode (GL_MODELVIEW) glLoadIdentity () glTranslatef (0, 0, -3) / / Матрица проекта управляет перспективным эффектом, приложенным к примитивов, и управляется подобно modelview матрицы: glMatrixMode (GL_PROJECTION ) glLoadIdentity () glFrustum (-1, 1, -1, 1, 1, 1000) / / Наконец, мы выпускаем многоугольник - зеленый, ровно ориентирован на XY оси: glBegin (GL_POLYGON) glColor3f (0, 1, 0) glVertex3f (-1, -1, 0); glVertex3f (-1, 1, 0); glVertex3f (1, 1, 0); glVertex3f (1, 1, 0); glEnd (); 

5. Документация

Значительной степени популярность OpenGL связана с наличием большого количества качественной документации.

OpenGL ARB выпустила ряд пособий вместе со спецификацией, которая была обновлена ​​для отражения изменений в API. Это почти универсальные пособия, известные, как цветные:

Учебники по OpenGL 2.0 и более поздних версий:

  • The Orange Book - Руководство по OpenGL Shading Language. ISBN 0-321-33489-2
    Четкий справочник и руководство по GLSL.

6. Расширение

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

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

Список спецификаций расширений можно найти здесь.


7. Сноски


8. Смотри также

9. Ресурсы сетей