OpenGL
Материал из Википедии — свободной энциклопедии
| OpenGL | |
| Тип | API |
| Разработчик | Silicon Graphics |
| ОС | Кроссплатформенное программное обеспечение |
| Версия | 3.1 — 24 марта 2009 |
| Лицензия | Различные |
| Сайт | opengl.org |
OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
Включает более 250-ти функций для рисования сложных трёхмерных сцен из простых примитивов. Используется при создании видео-игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с DirectX.
Содержание |
[править] Спецификация
На базовом уровне, OpenGL — это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации — библиотеки функций, соответствующих набору функций спецификации. Реализация использует возможности оборудования там, где это возможно. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests — тесты на соответствие) прежде чем реализация будет классифицирована как OpenGL реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.
Эффективные реализации OpenGL существуют для Windows, Unix-платформ, PlayStation 3 и Mac OS. Эти реализации обычно предоставляются изготовителями видеоадаптеров и активно используют возможности последних. Существуют также чисто программные реализации спецификации OpenGL, одной из которых является библиотека Mesa. Из лицензионных соображений Mesa является «неофициальной» реализацией OpenGL, хотя полностью с ней совместима на уровне кода.
Спецификация OpenGL пересматривается Консорциумом ARB (Architecture Review Board), который был сформирован в 1992 году. Консорциум состоит из компаний, заинтересованных в создании широко распространённого и доступного API. Согласно официальному сайту OpenGL, членами ARB с решающим голосом на ноябрь 2004 года являются производители профессиональных графических аппаратных средств SGI, 3Dlabs, Matrox и Evans & Sutherland (военные приложения), производители потребительских графических аппаратных средств ATI и NVIDIA, производитель процессоров Intel, и изготовители компьютеров и компьютерного оборудования IBM, Apple, Dell, Hewlett-Packard и Sun Microsystems, а также один из лидеров компьютерной игровой индустрии id Software. Microsoft, один из основоположников Консорциума, покинула его в марте 2003 года. Помимо постоянных членов, каждый год приглашается большое количество других компаний, становящихся частью OpenGL ARB в течение одного года. Такое большое число компаний, вовлеченных в разнообразный круг интересов, позволило OpenGL стать прикладным интерфейсом широкого назначения с большим количеством возможностей.
Курт Экелей (Kurt Akeley) и Марк Сегал (Mark Segal) являются авторами оригинальной спецификации OpenGL. Крис Фрэзиер (Chris Frazier) редактировал версию 1.1. Йон Лич (Jon Leech) редактировал версии с 1.2 по настоящую версию 2.0.
[править] Архитектура
OpenGL ориентируется на следующие две задачи:
- Скрыть сложности адаптации различных 3D-ускорителей предоставляя разработчику единый API.
- Скрыть различия в возможностях аппаратных платформ, требуя реализации недостающей функциональности с помощью программной эмуляции.
Основным принципом работы OpenGL является получение наборов векторных графических примитивов в виде точек, линий и многоугольников с последующей математической обработкой полученных данных и построением растровой картинки на экране и/или в памяти. Векторные трансформации и растеризация выполняются графическим конвейером (graphics pipeline), который по сути представляет из себя дискретный автомат. Абсолютное большинство команд OpenGL попадают в одну из двух групп: либо они добавляют графические примитивы на вход в конвейер, либо конфигурируют конвейер на различное исполнение трансформаций.
OpenGL является низкоуровневым процедурным API, что вынуждает программиста диктовать точную последовательность шагов, чтобы построить результирующую растровую графику (императивный подход). Это является основным отличием от дескрипторных подходов, когда вся сцена передается в виде структуры данных (чаще всего дерева), которое обрабатывается и строится на экране. С одной стороны императивный подход требует от программиста глубокого знания законов трёхмерной графики и математических моделей, с другой стороны — даёт свободу внедрения различных инноваций.
[править] Расширения
Стандарт OpenGL, с появлением новых технологий, позволяет отдельным производителям добавлять в библиотеку функциональность через механизм расширений. Расширения распространяются с помощью двух составляющих: заголовочный файл, в котором находятся прототипы новых функций и констант, а также драйвер устройства, поставляемого разработчиком. Каждый производитель имеет аббревиатуру, которая используется при именовании его новых функций и констант. Например, компания NVIDIA имеет аббревиатуру NV, которая используется при именовании ее новых функций, как, например, glCombinerParameterfvNV(), а также констант, GL_NORMAL_MAP_NV. Может случиться так, что определённое расширение могут реализовать несколько производителей. В этом случае используется аббревиатура EXT, например, glDeleteRenderbuffersEXT. В случае же, когда расширение одобряется Консорциумом ARB, оно приобретает аббревиатуру ARB и становится стандартным расширением. Обычно, расширения, одобренные Консорциумом ARB, включаются в одну из последующих спецификаций OpenGL.
Список зарегистрированных расширений можно найти в официальной базе расширений.[1]
[править] Дополнительные библиотеки
Существует ряд библиотек, созданных поверх или в дополнение к OpenGL. Например, библиотека GLU, являющаяся практически стандартным дополнением OpenGL и всегда её сопровождающая, построена поверх последней, то есть использует её функции для реализации своих возможностей. Другие библиотеки, как, например, GLUT и SDL, созданы для реализации возможностей, недоступных в OpenGL. К таким возможностям относятся создание интерфейса пользователя (окна, кнопки, меню и др.), настройка контекста рисования (область рисования, использующаяся OpenGL), обработка сообщений от устройств ввода/вывода (клавиатура, мышь и др.), а также работа с файлами. Обычно, каждый оконный менеджер имеет собственную библиотеку-расширение для реализации вышеописанных возможностей, например, WGL в Windows или GLX в X Window System, однако библиотеки GLUT и SDL являются кросс-платформенными, что облегчает перенос написанных приложений на другие платформы.
Библиотеки, как GLEW («The OpenGL Extension Wrangler Library») и GLEE («The OpenGL Easy Extension library») созданы для облегчения работы с расширениями и различными версиями OpenGL. Это особенно актуально для программистов в Windows, так как, заголовочные и библиотечные файлы, поставляемые с Visual Studio, находятся на уровне версии OpenGL 1.1.
OpenGL имеет только набор геометрических примитивов (точки, линии, многоугольники) из которых создаются все трёхмерные объекты. Порой подобный уровень детализации не всегда удобен при создании сцен. Поэтому поверх OpenGL были созданы более высокоуровневые библиотеки, такие как Open Inventor и VTK. Данные библиотеки позволяют оперировать более сложными трёхмерными объектами, что облегчает и ускоряет создание трёхмерной сцены.
[править] Независимость от языка программирования
Для подтверждения независимости от языка программирования были разработаны различные варианты привязки (binding) функций OpenGL или полностью перенесены на другие языки. Одним из примеров может служить библиотека Java 3D, которая может использовать аппаратное ускорение OpenGL. Прямая привязка функций реализована в Lightweight Java Game Library[2], которая имеет прямую привязку OpenGL для Java. Sun также выпустила версию Java OpenGL (JOGL), которая предоставляет прямую привязку к Си-функциям OpenGL, в отличие от Java 3D, которая не имеет столь низкоуровневой поддержки. Официальный сайт OpenGL имеет ссылки на привязки для языков Java, Фортран 90, Perl, Pike, Python, Ada, Visual Basic и Pascal.[3] Имеются также варианты привязки OpenGL для языков C++ и C#.[4]
[править] История
Компьютерная графика нашла широкое распространение и применение в повседневной жизни. Учёные используют компьютерную графику для анализа результатов моделирования. Инженеры и архитекторы используют трёхмерную графику для создания виртуальных моделей. Кинематографы создают удивительные спецэффекты или полностью анимированные фильмы («Шрек», «История игрушек» и др.). В последние годы широкое распространение получили также компьютерные игры, максимально использующие трёхмерную графику для создания виртуальных миров.
Распространению компьютерной графики сопутствовали свои трудности. В 1990-х разработка программного продукта, способного работать на большом количестве графического оборудования, была сопряжена с большими временными и финансовыми затратами. Было необходимо отдельно создавать модули для каждого типа графических адаптеров, что порой приводило к большой дупликации исходного кода. Это сильно тормозило развитие и распространение компьютерной графики.
Silicon Graphics Incorporated (SGI) специализировалась на создании высокотехнологического графического оборудования и программных средств. Являясь в то время лидером в трёхмерной графике, SGI видела проблемы и барьеры в росте рынка. Поэтому было принято решение стандартизировать метод доступа к графической аппаратуре на уровне программного интерфейса.
Таким образом появился программный интерфейс OpenGL, который стандартизирует доступ к графической аппаратуре, путем смещения ответственности за создание аппаратного драйвера на производителя графического устройства. Это позволило разработчикам программного обеспечения использовать более высокий уровень абстракции от графического оборудования, что значительно ускорило создание новых программных продуктов и снизило на них затраты.
В 1992 году компания SGI возглавила OpenGL ARB — группу компаний по разработке спецификации OpenGL. OpenGL эволюционировал из 3D-интерфейса SGI — IRIS GL. Одним из ограничений IRIS GL было то, что он позволял использовать только возможности, поддерживаемые оборудованием; если возможность не была реализована аппаратно, приложение не могло её использовать. OpenGL преодолевает эту проблему за счёт программной реализации возможностей, не предоставляемых аппаратно, что позволяет приложениям использовать этот интерфейс на относительно маломощных системах…
Когда в 1995 году была выпущена библиотека Direct3D, Microsoft, SGI и Hewlett-Packard начали проект под названием Fahrenheit, который предусматривал создание более универсального программного интерфейса на основе Direct3D и OpenGL. Идея казалась достаточно обещающей, призванной навести порядок в области интерактивной трёхмерной графики, однако в результате финансовых трудностей в SGI и отсутствии должной индустриальной поддержки проект был закрыт. Правда позже, 16 сентября 2005 года, он всё-таки, был выпущен.
[править] 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) и Cg (NVidia C for Graphics). К сожалению многие предложенные возможности пока отсутствуют в версии OpenGL 2.0[источник не указан 47 дней], хотя некоторые из них реализованы многими производителями в виде расширений.
[править] OpenGL 3.0
11 августа 2008 года Khronos Group представила новую версию спецификации OpenGL.[5]
[править] OpenGL 3.1
24 марта 2009 года Khronos Group анонсирует OpenGL 3.1. В новой версии произведена чистка компонентов, которые были объявлены устаревшими, но оставались в OpenGL 3.0 для сглаживания перехода на новую версию API (устаревшие компоненты возможно в дальнейшем использовать через GL_ARB_compatibility extension). Кроме того, в OpenGL 3.1 добавлен ряд новшеств, таких как:
- Поддержка OpenGL Shading Language версии 1.40 (GLSL)
- CopyBuffer API для быстрого копирования данных; используется в сочетании OpenCL
- Текстурные буферные объекты
- Uniform Buffer Objects
- Signed нормализованные текстуры
- Доступно минимум 16 текстурных единиц в vertex shader
- Primitive restart
- Instancing
Для использования только OpenGL 3.1, нужно использовать gl3.h.
[править] Примечания
- ↑ http://oss.sgi.com/projects/ogl-sample/registry/
- ↑ LWJGL(англ.) — OpenGL-привязка для Java языка и другие компоненты для разработки игр
- ↑ Programming Language Bindings to OpenGL
- ↑ http://www.exocortex.org/3dengine
- ↑ The Khronos Group announced today it has released the OpenGL 3.0 specification (англ.). opengl.org (11 августа 2008). Проверено 5 июня 2009.
[править] См. также
[править] Ссылки
- Официальный сайт
- Спецификации OpenGL
- сайт 3Dlabs для разработчиков использующих OpenGL(недоступная ссылка)
- Надстройка над OpenGL для Delphi
- Сайт программирования для GPU
- Уроки, примеры и дополнительные ресурсы
- Уроки по OpenGL(англ.)
- Уроки по OpenGL(рус.)
- Теория 3D-графики с примерами на OpenGL(рус.)
- Уроки с примерами для разработчиков игр(англ.)
- OpenGL Directory(англ.) — список ресурсов, относящихся к OpenGL
- Основы OpenGL освещения(англ.) — урок об освещении в OpenGL от Steve Baker
- JOGL(англ.) — OpenGL-привязка для Java
- Blender(англ.) — Open Source программа для трёхмерного 3d models моделирования, использующая OpenGL
- o-GL.ru (рус.) — статьи по программированию OpenGL на русском языке
- Стадии создания и технологический процесс проектирования САПР. Общие сведения о проектировании. Виды обеспечения САПР. Общие требования, предъявляемые к комплексу технических средств САПР. Классификация технических средств САПР(рус.) — МГСУ
- OpenGL. Введение(рус.)
- OpenGL в DMOZ — Библиотеки статей по OpenGL.
[править] Литература
- Ron Fosner. OpenGL Programming for Windows 95 and Windows NT. Addison-Wesley. ISBN 0-201-40709-4
- Mark Kilgard. OpenGL for the X Window System. Addison-Wesley. ISBN 0-201-48359-9
- OpenGL Architecture Review Board и др. OpenGL Reference Manual: The Official Reference Document to OpenGL, Version 1.4. Addison-Wesley. ISBN 0-321-17383-X
- Randi J. Rost. OpenGL Shading Language. Addison-Wesley. ISBN 0-321-19789-5
- OpenGL Architecture Review Board и др. OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 2, Fifth Edition. Addison-Wesley. ISBN 0-321-33573-2
- Ву М., Дэвис Т., Нейдер Дж., Шрайндер Д. OpenGL. Руководство по программированию. Библиотека программиста. Питер, 2006. ISBN 5-94723-827-6
- Рэнди Дж. Рост. OpenGL. Трёхмерная графика и язык программирования шейдеров. Для профессионалов. Питер, 2005. ISBN 5-469-00383-3, 0-321-19789-5
- Richard S. Wright, Benjamin Lipchak. OpenGL SuperBible. 3rd ed. SAMS Publishing. ISBN 0-672-32601-9
- Ричард С. Райт мл., Бенджамин Липчак. OpenGL. Суперкнига = OpenGL SuperBible. — 3 изд. — М.: «Вильямс», 2006. — С. 1040. — ISBN 5-8459-0998-8
- Дональд Херн, М. Паулин Бейкер. Компьютерная графика и стандарт OpenGL = Computer Graphics with OpenGL. — 3-е изд. — М.: «Вильямс», 2005. — 1168 с. — ISBN 5-8459-0772-1
- Эдвард Энджел. Интерактивная компьютерная графика. Вводный курс на базе OpenGL = Interactive Computer Graphics. A Top-Down Approach with Open GL. — 2-е изд. — М.: «Вильямс», 2001. — 592 с. — ISBN 5-8459-0209-6

