Что лучше opengl или directx
Перейти к содержимому

Что лучше opengl или directx

Сравнение OpenGL и Direct3D

Очень часто встречаются различные заблуждения по поводу этих двух API.

Я попытался изложить в этой статье основные факты, которые следует знать как разработчикам, так и конечным пользователям.

Так как тема очень холиварная, я старался придерживаться максимально нейтрального тона.

Взгляд с высоты птичьего полёта

Оба API предоставляют доступ к функциям аппаратного ускорения 3D-графики.

Direct3D — проприетарная разработка Microsoft, созданная специально для Windows. В настоящее время используется так же и на Microsoft Xbox. На других платформах недоступен (если не брать в учёт эмуляцию API, предоставляемую Wine, а также виртуализацию).

OpenGL — открытый стандарт, разрабатываемый некоммерческой организацией Khronos Group при участии сообщества. Все крупные производители GPU (nVidia, AMD, Intel), так или иначе, влияли на OpenGL. В отличие от Direct3D, доступен на очень большом количестве платформ. В частности, OpenGL является основным API для взаимодействия с GPU в Linux и Mac OS.

«Внешние» технические различия API

Direct3D основан на технологии COM. COM — это, по сути, стандарт бинарного представления компонентов. Как известно, классы на чистом C++ не могут быть использованы из других языков программирования, так как они не имеют стандартизованного бинарного представления. В частности, каждый компилятор использует свой собственный метод декорирования имён. COM же позволяет работать с объектно-ориентированной концепцией из любого языка, его поддерживающего. COM — это тоже Windows-specific технология (использует такие специфичные для Windows вещи, как реестр).

В приложении на Direct3D используются указатели на интерфейсы объектов. Работа с объектом осуществляется путём вызова методов его интерфейса. Например, интерфейс так называемого device-а (device в Direct3D — это контекст выполнения для конкретного окна), имеет название (примеры для Direct3D 9) IDirect3DDevice9, для объекта текстуры — IDirect3DTexture9, и т.д. Создание объектов происходит как вызовы методов интерфейса IDirect3DDevice9, например, для текстуры это будет IDirect3DDevice9::CreateTexture.

В Direct3D 10 произошло значительное количество изменений. Direct3D 10 не является обратно совместимым с Direct3D 9. Т.е. чтобы перенести программу на новый API потребуется переписать весь код, относящийся к рендерингу. Подробнее о Direct3D 10 ниже.

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

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

Аналогом концепции device-а в Direct3D здесь является контекст. Контекст OpenGL привязан к конкретному окну, так же, как и device в Direct3D.

Общим для двух API является то, что обе не предоставляют чего либо за пределами работы с графикой. А именно, нет функций ни для создания окна, ни для работы с вводом с клавиатуры/мыши, ни для работы со звуком (здесь я не затрагиваю другие части DirectX, такие как DirectInput и DirectSound). Т.е. они не являются библиотеками высокого уровня.

В самой упрощённой форме можно сказать так: OpenGL и Direct3D позволяют рисовать треугольники. И всё. Суть в том, что треугольники можно рисовать очень по-разному (текстуры, освещение, преобразования, и т.д.).

Самое важное различие

Имя ему — расширения (extensions).

Direct3D по сути фиксирован в пределах одной мажорной версии. Какие-либо изменения/дополнения происходят только при выпуске следующей версии.

В OpenGL реально доступное API определяется производителем GPU. Реализация OpenGL позволяет определять расширения к основной спецификации. Приложение может получить список поддерживаемых расширений во время выполнения, и проверить на доступность те, которые оно желает использовать.

На самом деле практически весь функционал OpenGL — это расширения. Развитие OpenGL идёт так: появляется новая фишка, производитель реализовывает её в своём драйвере и документирует доступное расширение. Приложения могут использовать новые функции прямо сейчас, не дожидаясь включения в официальную спецификацию. Если это расширение специфично для конкретного производителя, то в названии оно несёт его имя (например, вот так: GL_NV_point_sprite, где NV — значит nVidia). Если расширение реализовано многими вендорами, то в названии используется EXT (например, GL_EXT_draw_range_elements).

Со временем, если расширение широко используется, оно стандартизируется в ARB, и после этого содержит в имени ARB (например, GL_ARB_vertex_buffer_object). Такое расширение имеет официальный статус.

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

Что нового в Direct3D 10/11 и OpenGL 3.x

Microsoft сделали радикальную переработку API в Direct3D 10. Сейчас оно имеет более унифицированный и современный вид. Были выброшены некоторые устаревшие вещи, такие как fixed function rendering (без использования шейдеров). Ещё был выполнен переход к новой модели работы драйвера. В частности, реализация Direct3D теперь может иметь не только kernel-space часть, а и user-space. Это позволяет экономить время на переключения user-space/kernel-space. Однако, из-за новой модели драйвера, Direct3D 10 и выше недоступен на Windows XP. Учитывая всё ещё большую популярность Windows XP, это довольно грустно.

Реализация OpenGL изначально была разделена на user-space и kernel-space части, так что там такой проблемы и не было. Ещё различие в том, что до сих пор не вносилось изменений в OpenGL API, которые не были бы обратно совместимы. Каждое нововведение — это расширение.

Функционал, появившийся в Direct3D 10, например, геометрические шейдеры, доступен в OpenGL на любой платформе через расширение, или, начиная с OpenGL 3.2, как часть основной спецификации. Стоит особо подчеркнуть, это важно, функционал Direct3D 10/11 доступен в OpenGL на любой платформе, в том числе и Windows XP. Таким образом у многих сложилось впечатление, что Direct3D 10 не доступен на Windows XP исключительно по политическим причинам, а не из-за каких-то реальных технических проблем. Впрочем, я не могу судить здесь, сохраняя нейтральный тон, о том, были ли действительно такие проблемы при введении новой модели видео-драйверов.

Теперь о нововведениях в OpenGL 3.x. Начиная с OpenGL 3.0 появилась так называемая deprecation model. Часть старой функциональности, относящаяся к fixed function rendering, а также к рендерингу, основанному на glBegin/glEnd, и многие другие устаревшие и неактуальные вещи, были объявлены как deprecated, и были впоследствии удалены из основной спецификации OpenGL 3.1. Это позволяет сохранять основную спецификацию в актуальной и современной форме.

Казалось бы, это должно сломать совместимость со старыми программами. Ведь раньше, когда программа создавала контекст OpenGL, она просто получала контекст версии максимально доступной. Это было ОК, т.к. новые версии всегда являлись надстройками над предыдущими. Чтобы избежать нарушений совместимости, программы, которые хотят получить контект OpenGL 3.x должны использовать новый метод создания контекста, который позволяет указать, какую именно версию OpenGL нужно получить.

Но, как следует из того, что уже было написано раньше про расширения, и это важно, функционал OpenGL 3.x можно получить через расширения, не создавая контекст новым методом. Т.е. OpenGL 1.1 + расширения = OpenGL 3.2! Таким образом, сохраняется полная обратная совместимость. Например, геометрические шейдеры — это расширение GL_ARB_geometry_shader4.

Распространённые заблуждения

OpenGL отстаёт от Direct3D, и вообще, судя по таким вялым изменениям в спецификации, наверное уже совсем мёртв.

Собственно, причина такого заблуждения — это незнание о расширениях. Вообще говоря, OpenGL может и часто опережает (!) Direct3D в плане инноваций, т.к. производитель может добавить расширение к OpenGL, не дожидаясь никого, в то время как в Direct3D изменения может внести только Microsoft.

OpenGL — это для программ профессиональной графики, а Direct3D — это для игр.

Это заблуждение имеет историческую причину. OpenGL исходно разрабатывался как библиотека 3D графики, которая МОЖЕТ, но НЕ ОБЯЗАНА ускоряться аппаратно. Это также объясняет наличие некоторых функций, например рендеринг стерео-изображений, которые не нужны играм. Direct3D же разрабатывался гораздо позже, сразу с расчётом на ускорение на GPU. В момент появления многих пакетов профессиональной работы с графикой Direct3D просто не было.

Интересные нюансы

Microsoft поставляет вместе с Windows драйверы без поддержки OpenGL. OpenGL будет рендерить без ускорения, или эмулироваться через DirectX. Так что, если нужна поддержка OpenGL под Windows, нужно ставить драйвер с сайта производителя. Причины для такого неприятия OpenGL, скорее всего, опять чисто политические.

Так что же делать, как жить?

Примечание: А вот эта часть носит весьма субъективный характер.

Если Вы — разработчик, и решаете, какое API использовать, то задумайтесь над следующим:
За OpenGL — массовая кроссплатформенность, в частности, доступность всех новых функций и на Windows XP, где Direct3D 10/11 нет, и никогда не будет.
Против OpenGL — драйвера в Windows из коробки не имеют поддержки OpenGL, так что ставить их нужно с сайта производителя.

Если Вы — новичок в разработке 3D-приложений, и желаете освоить эту область, то я бы рекомендовал сделать так: сначала разобраться с Direct3D (причина тому проста — Microsoft предоставляет очень качественный SDK), а затем разобраться с OpenGL (это будет очень просто после Direct3D). К сожалению, такой вещи, как SDK, для OpenGL нет. Поэтому осваивать с нуля будет сложнее.

OpenGL или DirectX: что лучше, сравнительная характеристика, особенности, советы

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

Что такое OpenGL и DirectX?

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

Компоненты API в разработке игр

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

Для чего используются эти технологии

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

Пример современной компьютерной игры

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

Основные отличия DirectX и OpenGL

Что же касается основных отличий, не вдаваясь в технические аспекты функционирования, сразу же можно отметить, что платформа DirectX, являющая эксклюзивной разработкой корпорации Microsoft, предназначена исключительно для применения в Windows-системах и частично на Xbox, а OpenGL представляет свободно распространяемую кроссплатформенную технологию, применимую в других ОС (даже в мобильных). Лицензия GNU позволяет любому желающему вносить в компоненты этого API собственные изменения и дополнения, касающиеся ее усовершенствования с целью повышения производительности тех же видеокарт, в то время как улучшений DirectX приходится ждать только по мере выхода новых версий платформы. При этом даже с самыми новыми драйверами при использовании на старых версиях моста графические ускорители не выдают заявленных производителем показателей.

Главные преимущества и недостатки

Говоря о том, что лучше — OpenGL или DirectX 11 (12), отдельно стоит отметить, что первая платформа предназначена только для графики, а вторая может использоваться вообще для всего того, что относится к мультимедиа (за графику в данном случае отвечает компонент Direct3D).

OpenGL против DirectX 11

Кроме того, многим экспертами отмечается, что в очень высокой степени выбор в пользу того или иного моста может зависеть и от типа графической карты. Но, если подходить к сравнению непредвзято, считается, что в плане охвата платформ лучше выглядит OpenGL, но DirectX выигрывает в плане того, что является готовым программным продуктом вроде класса Plug&Play. Однако не стоит забывать и том, что инструментальный набор DirectX последних версий и так доступен в OpenGL, а вот обратной поддержки нет.

OpenGL или DirectX: что лучше для игр?

Что же касается игр, и тут однозначного ответа дать нельзя. Так, например, довольно часто можно встретить комментарии по поводу того, что графические чипы линейки Radeon 9800 лучшие результаты в тестах показывают на основе DirectX, а карты GeForce серии 5XXX – при использовании OpenGL. Зато у DirectX есть еще одно неоспоримое преимущество.

Ошибка загрузки модулей OpenGL при использовании видеокарт NVIDIA

Поскольку мост OpenGL изначально создавался для других платформ, с ним в Windows возможно появление разного рода багов, а вот DirectX позволяет довольно сносно пользоваться играми даже на относительно устаревших компьютерах без всяких торможений (яркий пример тому – игра Age Of Empires).

Производительность разных платформ в сравнении

Бывает и наоборот. Так, например, некоторые пользователи отмечают, что DOOM 3 на картах серии Radeon X1XXX с использованием OpenGL просто «летает», а Half-Life 2 очень часто «тормозит». Но тут, видимо, все зависит еще и от драйверов.

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

Что лучше для BlueStacks: DirectX или OpenGL?

Достаточно часто можно встретить и вопросы по поводу использования одного из самых популярных эмуляторов Android-систем под названием BlueStacks. Какую платформу предпочесть в BlueStacks — OpenGL или DirectX? Увы, и тут однозначного ответа дать нельзя.

Настройки графики в BlueStacks

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

Рекомендации разработчикам

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

Комплекты разработчика SDK для DirectX

Впрочем, многое может зависеть и от того, какую конечную цель вы перед собой ставите и какой именно функционал каждой платформы будет использоваться в каждом конкретном случае (только графика, только звук или какие-то объединенные решения).

Краткие выводы

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

DirectX или OpenGL [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 6 лет назад .

Как можно подойти к DirectX , чтоб его понять? Изучал OpenGL очень легкий, но широких возможностей я не встречал. Видел как на DirectX сделали (в Microsoft ) рендер моря. И думаю, что такое не возможно на OpenGL . Что лучше выбрать, то что я лучше понимаю или биться и понять DirectX ?

user avatar

Изучайте OpenGL 3.3 и выше. Современный OpenGL почти не уступает по своим возможностям DirectX.

Документация по Direct X написана лучше. В MSDN рассматривается сама суть построения трехмерной сцены с нуля. Авторы документации OpenGl подразумевают что вы уже знаете как использовать матрицы для афинных преобразований, что такое нормальны векторы, мипмаппинг, вертексные и фрагментные шейдеры, как работает конвейер, как накладываются текстуры и поэтому просто в алфавитном порядки описывают заголовки функций которые есть в библиотеке.

По поводу рендера моря в OpenGl то это значительно проще в поздних версиях, так как в них шейдеры пишутся на С подобном языке, а не на ассемблере видеокарты.

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

user avatar

Смотря для каких задач, OpenGL дает путь к кросплатформенной разработке, и возможность легко перейти в геймдев под мобильные платформы iOS/Android, что в данный момент довольно востребовано. С другой стороны DirectX дает более мощное API, и если речь идет о разработке игр/приложений исключительно под Win-платформу, то лучше писать на DX. А в современном, взрослом PC-шном геймдеве, DX по сути, стандарт.
К тому же DX и выглядит и работает быстрее, хотя все зависит от прямоты рук разработчиков (сравнивал игры L4D2 и TF2, на одном и том же компе под MacOS и Win7).

В общем на любителя, начать изучение 3D лучше с того, что больше нравится, потом всегда успеешь переквалифицироваться под то, что будет нужнее. А начать можешь с рисования кубика-рубика на OGL и DX. Сам поймешь что удобнее для тебя.

Первые версии OpenGL действительно очень лёгкие. Но из-за некоторых вещей страдает производительность. Например glBegin()glVertex()glEnd() намного медленнее, чем использование буфера вершин. В Директе этого нет, в новых версиях OpenGL это вырезали. Поэтому современный OpenGL не легче, чем Direct3D. Главным плюсом OpenGL является кроссплатформенность. Ещё OpenGL не сразу поддерживается в драйверах. Иногда в нём бывают баги, потому что он менее распространён, чем DX. Преимущество DirectX в том, что он состоит из нескольких частей. Direct3D — это только его отдельная часть. Ещё есть DirectSound, DirectMusic для звука, DirectInput для ввода. Хотя эти компоненты можно спокойно использовать в OpenGL приложении (только оно из-за этого перестанет быть кроссплатформенным). В DirectX ещё есть удобная отладка. Ещё с DX поставляется библиотека D3DX, одной из очень удобных функций которой является возможность загружать текстуры некоторых форматов. В OpenGL такого нет, надо самостоятельно загружать текстуры, зная двоичный формат файла, хотя можно найти вспомогательные библиотеки. Но несмотря на всё это, я выбрал OpenGL, так как планирую сделать свой движок кроссплатформенным.

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

1)практически объектно-неориентирован; 2)DirectX3D легче понимается структура самой библиотеки, пробовал изучать OpenGL, очень много вопросов для самоучки прямо налету, справка онлайн тоже не очень. Так что лично я создаю свое приложение на DirectX и С#, а потом когда все будет готово, буду потихоньку переводить код на эту не так развитую, но очень востребованную OpenGL/OpenGL ES для кросс-платформы вместе с C++ (Qt).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *