вторник, 29 июня 2010 г.

Обзор технологий OpenGL и OpenAL.

OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.

OpenAL (англ. Open Audio Library) — свободно распространяемый аппаратно-программный интерфейс (API) для работы с аудиоданными. Ключевой особенностью является работа со звуком в 3D пространстве и использование эффектов EAX.

Далее обо всех этих технологиях будет рассказано несколько подробнее.

OpenGL

OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.

Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct3D.

На базовом уровне, 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.

Список зарегистрированных расширений можно найти в официальной базе расширений.

Существует ряд библиотек, созданных поверх или в дополнение к 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. Данные библиотеки позволяют оперировать более сложными трёхмерными объектами, что облегчает и ускоряет создание трёхмерной сцены.

GLM (OpenGL Mathematics) — вспомогательная OpenGL библиотека, предоставляющая C++ программистам классы и функции для выполнения математических операций. Библиотека может использоваться при создании 3D-программ с использованием OpenGL[2]. Одной из характеристик GLM является то, что реализация основана на спецификации GLSL (OpenGL Shading Language). Исходный код GLM использует лицензию MIT.

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

OpenAL

Библиотека OpenAL (Open Audio Library), разработанная и поддерживаемая компаниями Creative Labs и Loki Entertainment, представляет собой бесплатную, кроссплатформенную библиотеку для работы с 3D-звуком с открытым кодом. Существуют версии OpenAL для платформ Mac OS 8/9, Mac OS X, Linux, BSD, Solaris, IRIX и M$ Windows.

Эта библиотека была использована в ряде игр, таких как Unreal II, Unreal Tournament 2003/2004, версии Doom III для Linux.

Большими плюсами этой библиотеки (кроме поддержки такой компании как Creative Labs) является как ее простота, так и то, что по стилю она очень сильно напоминает библиотеку OpenGL. Поэтому для программистов, уже знакомых с OpenGL, освоение OpenAL становится очень простым и быстрым.

Для начала работы с OpenAL скачайте OpenAL SDK для используемой Вами платформы. Все примеры к данной статье компилировались как для Windows, так и для Linux.

Основными понятиями OpenAL являются аудиоустройство (audio device), аудиоконтекст (audio context), слушатель (listener), источники звука (sources) и буфера (buffers).

Понятие контекста в OpenAL очень близко к своему аналогу в OpenGL. Все производимые изменения параметров происходят в пределах определенного контекста, связанного с аудиоустройством. Возможно наличие нескольких аудиоконтекстов для одного аудиоустройства, между которыми можно переключаться.

Для простейших примеров всю работу с аудио устройствами и контекстами можно переложить на входящую в состав OpenAL SDK библиотеку alut.

Библиотека OpenAL позволяет задавать в трехмерном пространстве различные источники звука и слушателя. И для каждого источника звука и для слушателя можно задать ряд параметров (таких как, положение, скорость и т.п.), влияющих на получающийся в результате звук.

Библиотека OpenAL на основе этой информации осуществляет обработку звука (учитывая при этом как взаимное расположение слушателя и источников звука, так и их скорости). После обработки происходит смешение звука от различных источников для получения выходного сигнала для каждого из выходных каналов.

Кроме интуитивно понятных понятий слушателя и источников, в OpenAL важную роль играет понятие буфера. Именно посредством буферов осуществляется задание непосредственных звуковых данных (Raw PCM), которые должны выводится для каждого из источников.

Можно для источника задать сразу несколько буферов, организовав их в очередь. Тогда после того как все данные из одного буфера будут выведены, происходит автоматическое переключение на следующий буфер.

Комментариев нет:

Отправить комментарий