GameDev :: Статья 3

Статья 3. Direct3D vs OpenGL: Что Выбрать. Часть 1.

Автор: Промит Рои (Promit Roy), Перевод: Алексей Сало (Alex Salo)

При написании статьи я старался, как только мог избегать различного рода ошибок. Но, если вы все-таки найдете незначительные ошибки, прошу прощение. Все факты в этой статье подтверждены надежными источниками. Также, прошу понимать, что эта статья написана для новичков, которые еще не уверены, с чего начать программировать графику, и поэтому я придерживался нейтральной стороны по отношению к двум АПИ (D3D и OGL). (АПИ, от англ. API- application programming interface- прим. перев.).

На протяжении уже многих лет вопрос о том, что выбрать- OpenGL или Direct3D вызывает горячие споры. И почти все, что было сказано по этому поводу, не в состоянии помочь в выборе АПИ. Фанатики имеются на обеих сторонах; некоторые люди будут утверждать, что OpenGL- это единственное средство от всех бед, иные же будут клясться и уверять в обратном. Некоторые говорят, что лучший вариант- это попробовать и то, и другое, а затем для себя определить, что больше подходит. Но и это не является оптимальным решением. Порой сделать выбор- это очень трудная задача, и я хотел бы вам в этом помочь. Вообще, я специализируюсь на программировании под Win32, поэтому статья будет нацелена как раз на эту платформу. Хотя, не стоит волноваться, я рассмотрю и другие платформы.

В этой статье я буду концентрировать внимание только на двух АПИ: OpenGL 1.3 и DirectX 8.1. Я не имел возможности поработать с другими АПИ, поэтому рассматривать ничего другого не будем (разве что немножко посмотрим на Glide). Я попытаюсь представить вам факты о каждом из АПИ, их структуру, и какого кода следует вам ожидать. Однако, в действительности, я не включу ни строчки программного кода здесь. Этого добра с головой хватает на GameDev.net (альтернатива на русском- GameDev.ru- прим. перев.). Эта статья должна быть понятна каждому, так как никаких сложных терминов в ней не использовано. Таким образом, я надеюсь вы уже знаете что такое АПИ, и для чего он служит. На случай, если вы не располагаете такой информацией, АПИ- это интерфейс прокладного программирования, и по существу, это набор функций, которые выполняют определенную задачу. Этой задачей является связка с графическим аппаратным обеспечением.

Факты: Direct3D8
Долгое время Direct3D считался довольно плохим АПИ по сравнению с OpenGL. Но, прогресс в создании АПИ, однако, сделал его очень мощным и надежным. И теперь многие люди уверенны, что именно Direct3D является стандартом в графике на Windows платформе, а не OpenGL. Microsoft очень тесно сотрудничает с фирмами- производителями графических карт, чтобы все новшества, представленные ими, были поддерживаемы в Direct3D. Обычно, Direct3D поддерживает новые возможности, еще до поддержки оных видеокартами.

История
Итак, после дебюта Windows 95, подавляющее большинство компьютерных игр разрабатывалось еще под DOS. Microsoft желала, чтобы разработчики игр отходили от DOS, и начинали создавать игры под Windows, в свою очередь, делая эту ОС все более популярной. Однако Windows не обеспечивала хорошую игровую платформу. Множество уровней абстракции делали доступ до видео- и звуковых карт очень ограниченным и медленным. И тогда, они решили разработать АПИ, которая дала бы разработчикам игр более прямой доступ до аппаратного обеспечения, тем самым увеличив скорость выполнения игр под Windows.

Вместо того чтобы разрабатывать свой собственный 3Д АПИ, они заметили многообещающий 3Д АПИ, разработанный компанией RenderMorphics. Это был маленький проект, разработанный компанией, и представленный на выставке, когда Microsoft заметила его. Они интегрировали его в свою собственную мини - графическую библиотеку, известную нам как Game SDK. Они ожидали, что эта библиотека станет отличным решением для разработчиков. Оказалось - ошиблись…

То, что позже стало известным как DirectX 1.0, не было широко принято. Причины тому были следующие: много ошибок, маленькая скорость, плохая структура, большая сложность в использовании.

Конечно, Microsoft и не собиралась сдаваться. Они продолжали работать над своим творением, спрашивая у общественности совета по его улучшению. Первой более-менее жизнеспособной версией DirectX стала DirectX 3.0. Через несколько лет они выпустили пятую версию (видимо о четвертой забыли- заработались ребята- прим. перев.), которая стала первой истинно используемой версией. Улучшения были сделаны в 6й версии. Затем пришел DirectX 7.0.

DirectX 7.0 был первой версией, которая была принята во все объятия разработчиками. Она (эта версия) работала хорошо, делала создание игр разумно простым, большому количеству людей нравился интерфейс. До, и включая DirectX 7, DirectX включал два компонента для работы с графикой: DirectDraw и Direct3D. DirectDraw использовался для работы только с двумерной графикой, но справлялся с этим довольно хорошо.

С DirectX8, интерфейс DirectDraw, который уже не менялся несколько версий подряд, наконец исчез как отдельный компонент. Хотя это было спорным действием, Microsoft захотела сфокусироваться на 3Д аспекте АПИ. Большинство вещей, которые делались в 2Д, можно с легкостью сделать, используя трехмерную технологию, с преимуществом работать быстрее из-за использования аппаратного ускорения. Кроме того, более старый интерфейс DirectDraw остается доступным из-за природы технологии COM.

Структура
Структура Direct3D, и DirectX в общем, очень сильно отличается от оной в OpenGL. Однако, с течением времени, DirectX медленно обретает схожесть с OpenGL. Я не буду показывать вам различные диаграммы, но в основном, DirectX основывается на объектной модели COM. Это означает то, что вы создаете указатели на классы и используете их, что является предпочтительней, чем просто голые вызовы функций, которые не вызывают никаких ассоциаций.

Объект COM аналогичен классу в Си++. Вы даже можете делать производные классы от DirectX классов, что является одной из самых глупых затей, которые можно сделать. Типичное DirectX приложение имеет несколько структур, таких как, к примеру, LPDIRECT3DDEVICE8. К сожалению, написание DirectX приложений на чистом Си является не самой забавной вещью.…Из-за того, как устроена работа COM, вы должны явно разыменовывать VTable, а также передавать указатель в интерфейс, что в Си++ реализовано очень просто. Что все это значит? Да то, что вместо того, чтобы написать D3DDevice->СделатьЧто-то(Параметры), вам придется писать D3DDevice-lpVtbl-СделатьЧто-то(D3DDevice, Параметры). Не очень красиво.

DirectX, естественно, затрудняет работу с Си-структурами, и часто ваша программа состоит из набора классов. Рэндер (прорисовка) осуществляется между двумя вызовами: Direct3DDevice8-BeginScene() и Direct3DDevice8-EndScene(), что является «позаимствованным» из OpenGL. Когда вы завершаете работу своей программы, нужно следовать следующему правилу: вы должны вызвать X->Release, где Х- это COM объект, чтобы освободить ресурсы, занимаемые данным объектом.

DirectX также обеспечивает кое-что под названием функциональная библиотекя Direct3DX, которая была представлена вместе с DirectX 7.0. Это статическая библиотека, которая обеспечивает нас полезными функциями, облегчающими нашу жизнь. Библиотека Direct3DX предоставляет в наше распоряжение множество функций, которые были сильно оптимизированы. Среди прочий операций, это библиотека загружает и сохраняет mesh’и, выполняет операции над матрицами и векторами, предоставляет больше сотни расширенных Си++ структур данных, и управляет такими вещами, как трехмерный шрифт.

Последняя вещь, о которой будет упомянуто - это Каркас DirectX Приложений (сейчас это называется Общие DirectX Файлы). Дело в том, что даже рисование простого треугольника займет много строчек кода. Чтобы уменьшить количество кода, необходимое даже для выполнения простых операций, Microsoft написала набор классов, которые делают рутинную работу за вас. Вся инициализация скрыта от вас. Даже от части сложные операции, такие как перечисление всех возможностей графической карты управляются с помощью Общих Файлов (англ. Common Files). Исходный код классов вам также доступен, и вы имеете возможность изменить что-нибудь по своему усмотрению. Я рекомендую вам использовать Общие Файлы, но нужно знать, как они работают и как устроены.

Достоинства
Direct3D делает некоторые вещи очень даже хорошо. Двумя главными его достоинствами, придя с 8 версией, являются программируемые пиксельные и вертексные шейдеры. Не буду вдаваться в подробности о том, что это такое, скажу лишь, что эти шейдеры позволяют заменять части рендер конвейера своим кодом. Шейдеры пишутся на определенном типе графического языка, код которого очень похож на язык Ассемблер (в 9-й версии, которая появилась совсем недавно, язык для написания шейдеров был изменен, теперь он почти не отличается от Си- прим. перев.). Также хочется заметить, что OpenGL также поддерживает вертексные и пиксельные шейдеры, но делается это через расширения, и в настоящее время графические производители не соглашаются на их стандартное использование. С другой стороны, только самые современные карты (типа, GeForce 3, или 4, или Radeon 8500) поддерживают пиксельные шейдеры. Некоторые более старые карты поддерживают вертексные шейдеры.

Direct3D обеспечивает функциями для проверки доступного графического оборудования на компьютере.

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

Если вы любите ООП (объектно-ориентированное программирование), и в частности COM модель, то вы будете чувствовать себя как дома с интерфейсом Direct3D.

Как правило, СОМ интерфейс не может быть изменен (а DX построен, как уже говорилось неоднократно, на COM). Это может показаться плохой вещью, но на самом деле это не так из-за двух причин. Первая - хотя данный интерфейс не может быть изменен, можно спокойно создавать новые версии интерфейса, которые будут изменены, как вы того желаете. Вторая - поскольку интерфейс никогда не может быть полностью удален, старые игры могут работать и с последней версией DirectX. Так как старый интерфейс, полностью не задет изменениями, присутствует в любой последующей версии.

Слабые стороны
DirectX обновляется только раз в год, или около того. Это очень медленный темп по сравнению с развитием графической индустрии.

D3D нужно много коду для инициализации. Хотя, с приходом DirectX8 картина немного изменилась. Теперь вам нужно примерно 200 строчек кода (против 800- на Direct3D7) для того, чтобы нарисовать свой первый треугольник. Также, D3D требует более глубоких знаний того, как все устроено и как работает. Чтобы начать с D3D потребуется учить больше всего, чем в случае с OpenGL (хотя, эти знания не помешают при работе с OGL). D3D имеет также очень плохую переносимость. Насколько плохую? Он вообще не переносим на другие платформы. Так что, если вы захотите разрабатывать мульти-платформенные проекты, то D3D вам не в состоянии в этом помочь.

Direct3D не является открытым стандартом. Это означает, что за Microsoft, и только за Microsoft, последнее слово о том, что будет включено в релиз, и даже если они предпримут ошибочное решение, так оно и будет в течении, минимум одного года. Насколько удачно Microsoft принимает решение- это мнение каждого отдельного человека.

И последнее, написание DirectX игр на чистом Си будет очень затруднительно, и приведет вас к отчаянию. Как вы успели заметить Си код для Direct3D будет не лучшим решением.

Языковая поддержка
Одной из спецификаций СОМ является то, что язык независим. Хотя, на протяжении долгого времени, любые языки, кроме Си/Си++, не поддерживались. С DirectX7 появилась поддержка языка Visual Basic (он не поддерживает указатели и т.п., так что понадобилась новая библиотека dx7vb.dll). Насколько мне известно, D3D поддерживают большинство языков программирования.

Будущее
Здесь не на что особенно смотреть. Я сомневаюсь, что Microsoft сделает DirectX доступным на других платформах. Что касается новых возможностей, то Microsoft будет идти в ногу с производителями графического оборудования, добавляя все новые и новые возможности аппаратного обеспечения.

Комментарии/Мой совет
Direct3D довольно полезная вещь для создания Win32 игр. Он сделан исключительно для Win32. Поскольку Direct3D сделан только для Windows систем, он обычно не используется в профессиональных графических приложениях. Многие люди, работающие с графикой, предпочитают Unix, или SGI workstation, а Direct3D не поддерживает (и вероятно никогда не будет поддерживать) эти платформы. Вообще, нету ничего такого, чтобы Direct3D смог бы сделать, а OpenGL- нет, но он имеет преимущество в том, что для использования последних аппаратных возможностей видеокарт вам не нужно писать части кода на определенном языке, который выпускает тот, или иной производитель (например, Cg от nVidia- прим. перев.).

Direct3D намного сложнее из-за того, что он не прячет низкоуровневые вещи, как это делает OpenGL. Понятно, что простота идет в убыток гибкости. Но нужна ли вам, на самом деле такая «гибкость»? Существует намного больше вещей, над которыми действительно нужно поломать голову.

В следующей части мы рассмотрим также детально АПИ OpenGL 1.3
Alex Salo

Навигация
Назад | Список статей | Вперед
Используются технологии uCoz