OpenGL и DirectX: взгляд изнутри

altМногие годы в программистском сообществе идет дискуссия о преимуществах использования того или иного интерфейса для создания графики в компьютерных играх (и не только). Главные соперники в этой области – библиотеки OpenGL и DirectX.

Индустрия до сих пор так и не сделала однозначный выбор в пользу того или иного API. Для тех, кто не знает: API – это Application Programming Interface, то есть интерфейс прикладного программирования. Фактически – набор функций для выполнения различных задач. В нашем случае задача – это программирование трехмерной графики.

КАК ЭТО БЫЛО

OpenGL
Стандарт OpenGL (Open Graphics Library – открытая графическая библиотека) был создан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения как эффективный аппаратно-независимый интерфейс, пригодный для реализации на различных платформах. Основой стандарта стала библиотека IRIS GL, изначально разработанная фирмой Silicon Graphics Inc (SGI). OpenGL была утверждена как открытый стандарт (не open source, как некоторые думают) и поэтому библиотека доступна на многих платформах.

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

Развитие стандарта OpenGL осуществляется специальной бюрократической структурой, известной как Architectural Review Board (ARB) – Комитет по пересмотру архитектуры. Комитет состоит из представителей основных компаний, заинтересованных в развитии и использовании библиотеки. В их числе 3D Labs, SGI, Apple, NVIDIA, ATI, Intel, id Software и, конечно, Microsoft.

Кстати, Microsoft поставляет реализацию OpenGL вместе со своими операционными системами. Она соответствует одной из ранних версий OpenGL и не использует возможности аппаратного ускорения. Этот недостаток восполняют драйверы видеокарт, которые предоставляют быстрые реализации OpenGL.

C начала 90-х годов прошлого века OpenGL используется в различных областях индустрии и науки. Архитектура библиотеки получилась настолько удачной, что уже на протяжении более десяти лет она остается стабильной и предсказуемой. OpenGL де-факто является стандартом в области программирования графики. Но в этом скрыт и ее недостаток. ARB работает довольно медленно – любое изменение стандарта требует множества согласований, документов и так далее.

В силу этого OpenGL развивается очень вяло. Правда, до последнего времени с этим не было проблем, поскольку изначально библиотека предназначалась для быстрых рабочих станций профессионального уровня, которые обновляют не так уж часто. Однако сейчас даже дешевые видеокарты за $100 превзошли уровень профессиональных монстров пятилетней давности стоимостью в тысячи долларов.

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

На данный момент OpenGL прошла путь от версии 1.0 до версии 1.4 (и это за десять лет!). Версия 2.0, обещающая революционные изменения, находится в процессе стандартизации.
DirectX

К моменту выхода Windows 95 большинство игр по-прежнему делалось под MS-DOS. Windows в те времена не предоставляла возможностей для программирования игр. Многочисленные уровни абстракции (введенные в целях совместимости и универсальности) делали доступ к звуковому и видеооборудованию весьма медленным и неприменимым для игровых приложений. Поэтому было решено разработать библиотеку, предоставляющую возможность прямого доступа к аппаратуре. Это позволило бы играм работать на приемлемой скорости (и увеличило бы продажи Windows 95).

Вместо создания собственного API Microsoft использовала разработку небольшой компании RenderMorphic. Говорят, что изначально API был выполнен авторами в рамках студенческого задания и в конечном итоге провалился на экзамене. Тем не менее Microsoft интегрировала эту библиотеку в свой Game SDK. Корпорация подавала это как идеальное решение для программирования игр.

Однако то, что позже стало называться DirectX 1.0., не приобрело широкой популярности. Библиотека оказалась медленной, с большим количеством ошибок, с неудобной архитектурой и, кроме того, чрезмерно сложной.

Разумеется, Microsoft не собиралась сдаваться и продолжила развитие библиотеки с учетом пожеланий разработчиков игр. Первой более или менее жизнеспособной версией была DirectX 3.0. Позже последовали версии 5, 6 и 7 (четвертой не было). Седьмая версия была воспринята разработчиками с интересом: она хорошо работала, ее интерфейсы были в меру разумны.

Восьмая версия не заставила себя ждать и принесла интересные нововведения – вершинные и пиксельные шейдеры (специальные, обычно короткие программы, предназначенные для выполнения на графическом процессоре; используются для расчета освещения, создания тех или иных спецэффектов и так далее). Недавно вышедший DirectX 9 также развивает эти перспективные направления.

Длительное время DirectX рассматривался как неудачная альтернатива OpenGL. Однако последние улучшения в API сделали эту библиотеку весьма мощной и стабильной. Поскольку она разрабатывается авторами ОС, можно быть уверенным, что скорость ее работы с графикой оптимальна. Многие считают, что именно DirectX, а не OpenGL, становится стандартом для программирования графики. Microsoft постоянно работает в тесном контакте с разработчиками «железа», обеспечивая поддержку новых возможностей аппаратуры. Более того, DirectX иногда предлагает различные возможности раньше, чем на рынке появляются видеокарты с их аппаратной реализацией.

Мы рассматриваем только графическую часть DirectX, но кроме графики DirectX также предлагает интерфейсы для работы со звуком, источникам ввода, мультимедиа и так далее. У OpenGL таких функций нет – это чисто графическая библиотека.

АРХИТЕКТУРА

Ключевая особенность OpenGL – простота. Ядро OpenGL контролирует процесс обработки примитивов (то есть треугольников). Для передачи данных используется процедурная модель, фактически – вызовы функций. В каждый момент времени состояние OpenGL определяется через набор переменных, задающих параметры обработки (например, накладывать текстуру или не накладывать).

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

Структура DirectX очень сильно отличается от OpenGL. DirectX основан на модели COM (Component Object Model). Тем, кто знает, что это такое, сама аббревиатура уже скажет многое. Для остальных заметим лишь, что в отличие от простого вызова функций эта модель предполагает выполнение некоторых дополнительных действий, связанных с компонентной архитектурой DirectX.

Такая архитектура имеет как достоинства, так и недостатки. В частности, код, в котором используются вызовы DirectX, обычно не является идеалом легко читаемого и понимаемого. Поэтому даже рисование простого треугольника требует огромного объема кода. Разработчики Microsoft, конечно, понимают это, поэтому для упрощения программирования ими создана отдельная библиотека DirectX Common Files, которая скрывает часто используемый код.

Хотя принципиально архитектура DirectX сильно отличается от OpenGL, в их развитии все более заметны тенденции к сближению. Такая ситуация возникает прежде всего потому, что обе библиотеки предназначены для эффективной работы с аппаратурой, и чем ближе их структура будет к «железу», тем меньше времени будет уходить на преобразование команд пользователя в команды аппаратуры.

ПРОИЗВОДИТЕЛЬНОСТЬ

Вопрос производительности настолько же важен, насколько запутан и неясен. Дебаты на тему «Что быстрее – OpenGL или DirectX?» не утихают. При этом, как ни парадоксально, cкорость обоих библиотек одинакова.
Иначе и быть не может, потому что сейчас большинство функций реализованы напрямую через аппаратные ускорители. Естественно, производительность может различаться в зависимости от степени оптимизации программного кода и используемой для тестирования аппаратной платформы.

Оптимизация аппаратных драйверов тоже может внести свой вклад в преимущество той или иной библиотеки. Такие вещи достаточно тяжело предвидеть, поэтому хорошие игровые «движки» часто имеют две версии: под OpenGL и под DirectX. Это не очень-то хорошо как для производителя, так и для пользователя (возрастает стоимость разработки игр, появляются ошибки и т.п.), но таковы реалии современного рынка видеоигр.

Пример: считается, что драйверы от фирмы ATI для серии видеокарт ATI Radeon хорошо оптимизированы под DirectX и значительно слабее поддерживают OpenGL. Однако специально написанные тесты не выявили значительной разницы в скорости работы программ. Кроме того, на недавней Конференции разработчиков игр (КРИ, www.kriconf.ru) автору довелось побеседовать на эту тему с представителем ATI. Точка зрения последнего такова: если драйверы OpenGL у ATI и хуже, чем у NVIDIA, то это лишь вопрос времени – ATI обязательно будет в поддерживать OpenGL в полном объеме.

СРАВНЕНИЕ

В чем же, если не в производительности, различие между библиотеками? Прежде всего – в удобстве интерфейса, функциях, гибкости, перспективах развития и области применения. Начнем с функций. Неоднократно приходилось слышать заявления типа: «DirectX 9 поддерживает пиксельные шейдеры, а OpenGL не поддерживает, поэтому все игры должны быть написаны под DirectX!» Такое мнение неверно только отчасти. Действительно, если посмотреть на стандарт OpenGL последней версии (1.4), в нем ни слова о шейдерах.

Изображение, получаемое в реальном времени на современном аппаратном ускорителе. Качество и скорость рисования не зависят от применяемой библиотеки: DirectX и OpenGL обладают схожими возможностями.

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

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

Данный механизм выглядит (и на самом деле является) неудобным. В DirectX все проще: функциональность либо поддерживается данной версией библиотеки, либо не поддерживается. Если нет – придется надеяться и ждать следующей версии. Однако случаи, когда аппаратные функции не используются из-за того, что не были включены в версию DirectX, довольно редки – как уже говорилось, Microsoft тесно работает с производителями игрового (и не только) «железа». С другой стороны, ждать версий DirectX приходится около года, а в это время новые функции уже доступны через расширения OpenGL.

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

COM в DirectX используется для внесения изменений в библиотеку (в новых версиях) без изменения существующего кода. В OpenGL такого нет, но это вряд ли можно назвать серьезным недостатком.
Объем кода, необходимого для написания простой программы на DirectX, весьма велик (варьируется от 200 до 800 строк). Microsoft активно пытается уменьшить этот показатель, но он, тем не менее, достаточно велик. В OpenGL все существенно проще – для решения такой же задачи необходимо менее 50 строк кода.

OpenGL идеален для визуализации результатов научных исследований.

Серьезным достоинством OpenGL является прежде всего то, что это «открытый стандарт». Любая компания, имеющая аппаратную платформу, может купить лицензию у SGI и затем сделать собственную реализацию OpenGL. Изменения в OpenGL предлагаются, обсуждаются и утверждаются представителями различных компаний. Что касается DirectX, то здесь ситуация прямо противоположная. Только Microsoft может вносить какие-либо изменения в библиотеку. Иначе говоря, именно Microsoft в конечном итоге определяет все пути развития библиотеки, и если путь был выбран неверно, это может быть исправлено только в новой версии.

Итак, достоинства библиотек становятся наиболее очевидны при их использовании в разных (но в то же время пересекающихся) прикладных областях. DirectX идеален для профессиональной разработки игр и мультимедийных приложений на платформе Windows. OpenGL используется на высокопроизводительных рабочих станциях, в научной сфере, в образовании, а также в любых проектах, где требуется переносимость. Кроме того, OpenGL применяется и для написания игровых «движков», правда, в последнее время на этом поприще его теснит DirectX.

ЧТО ДАЛЬШЕ?

Появление графических процессоров (GPU – Graphics Processing Unit) нового поколения, позволяющих создавать доселе немыслимые спецэффекты в реальном времени, всколыхнуло индустрию, и вскоре стало ясно, что за ними будущее. Очевидно, что графические библиотеки должны соответствовать этой тенденции.
Начиная с восьмой версии, DirectX имеет встроенную поддержку программируемых шейдеров. В девятой версии эта поддержка была значительно улучшена и расширена. И в дальнейшем развитие DirectX наверняка будет связано с постепенным улучшением гибкости и удобства использования программируемого «железа». Каких-либо радикальных перемен пока не ожидается. Например, вряд ли стоит надеяться, что Microsoft сделает реализации DirectX на других платформах.

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

Игровые приложения чаще используют DirectX. Эта библиотека предоставляет больше возможностей для тонкой оптимизации и управления аппаратурой, а также, в отличие от OpenGL, содержит компоненты для работы с видео, звуком и устройствами ввода.

В то же время близится к завершению разработка нового стандарта библиотеки – OpenGL 2.0. Развитие графической аппаратуры вышло за пределы исходной спецификации. Вторая версия OpenGL призвана поднять планку и вновь создать стандарт для компьютерной графики на десятилетия. Помимо прочего OpenGL 2.0 включает в себя возможность программирования всего графического конвейера на языке высокого уровня (подобный язык уже появился в девятой версии DirectX и называется HLSL – High Level Shading Language)

Таким образом, в перспективе вновь ожидается конкуренция между последующими версиями графических библиотек, от которой программисты только выиграют: одни получат желаемую мощь и тонкие настройки «железа» DirectX, другие – простоту и не меньшие возможности OpenGL.

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

Прежде всего это касается интерактивности – не хватает мощностей как центрального, так и графического процессора. Но мощности растут, порой даже обгоняя закон Мура. А при условии достаточных мощностей на первый план выходят возможности программирования графического процессора для получения реалистичных спецэффектов.

Уже сейчас при просмотре технических демо NVIDIA и ATI иногда дух захватывает от красоты картинки! Описанные нами графические библиотеки как раз и являются для программистов проводниками в мир возможностей графического «железа».

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

Можно ожидать повсеместного распространения высококачественных теней, использования различных отражающих поверхностей, процедурных текстур, деформируемой геометрии и так далее. Представляете, точным выстрелом разбить стакан вина на столе, приблизиться и увидеть свое отражение в каждой капле? И игру света от осколков стекла? Все это будет, и довольно скоро. Не сомневайтесь.