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

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

  • автор:

В чем различие между OpenGL, DirectX, OpenCL, CUDA?

сразу прошу прощение за очень глупый вопрос, но чем отличается OpenСL от DirectX, OpenGL, CUDA? почему есть сравнение DirectX с OpenGL и OpenCL с CUDA, но нет сравнения допустим OpenCL и DirectX? я догадываюсь что они очень разные, но как я понимаю они все позволяют обращаться к видеокарте и ускорять с помощью нее вычисления. Хотелось бы узнать различие между этими технологиями и что за что отвечает?

Отслеживать
задан 21 апр 2020 в 15:47
Илья Антипанов Илья Антипанов
111 1 1 серебряный знак 9 9 бронзовых знаков
А как вы собираетесь сравнивать сладкое и зелёное?
21 апр 2020 в 16:02

@ArchDemon По идее они не являются «сладким или зеленым», по факту это API для доступа к ресурсам видеокарты. Если бы один обращался к видеокарте, второй к звуковой карте, третий к сетевым параметрам тогда я бы понял что нельзя их сравнивать, но тут все они обращаются к видеокарте и делают на ней просчеты, значит сравнить их можно по скорости работы и применению в разных сферах и где какая технология предпочтительней.

21 апр 2020 в 16:05

Для начала: OpenGL и DirectX предназначены для работы с графикой, а CUDA и OpenCL — для распараллеливания на GPU. Т.е эти внутри этих пар их можно как-то сравнивать, но между — нет.

21 апр 2020 в 16:06

То что сладкое и зелёное принадлежит моему яблоку, ещё не значит эти характеристики можно сравнивать между собой

21 апр 2020 в 16:07

@ArchDemon можно ли с помощью каждой технологии сделать подсчеты с графикой? Если да, то вполне можно сравнить или все таки расписать в чем принципиальное их отличие, где используется одна технология, а где другая. Если обратиться к википедии и сравнить directX и openCL то область применения у них попадает на графику, встает вопрос когда рационально использовать одно а когда другое.

21 апр 2020 в 16:15

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

OpenGL vs DirectX

Это два движка для отрисовки графики.

DirectX — это только для Windows, с C++ и интерфейсами, с закрытым кодом.

OpenGL открытый, есть для многих разных платформ. Внутри код написан в Си стиле.

В принципе любая игра может быть написана на любой из платформ. Да, на них можно сделать расчеты, но неудобно.

OpenCL vs CUDA

А это средства, которые позволяют использовать видеокарту для рассчётов. В первом приближении можно считать, что видеокарта это много-много маленьких процессоров, которые умеют выполнять однотипные расчеты.

CUDA — разработка от Nvidia. Закрытые исходники, только для Nvidia. OpenCL — открытое, для разнообразных видеокарт.

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

OpenGL или DirectX?

Я начинающий геймдев. Неплохо знаю SFML. Знаю c++. И вот меня потянуло на 3D игры. Начал думать: OpenGL или DirectX. В итоге недавно начал изучать DirectX,но и OpenGL тоже интересует. Прошу расписать плюсы и минусы,и что же будет лучше для создания игр/движков.

  • Вопрос задан более трёх лет назад
  • 8755 просмотров

Комментировать
Решения вопроса 1

Nipheris

Станислав Макаров @Nipheris Куратор тега C++

Зависит от ваших текущих знаний и пожеланий, особенно от того, насколько вы готовы разбираться с каждой их технологий.

OpenGL это кроссплатформенное API, раньше было не очень удобно начинать работу с ним на Винде, сейчас доступны различные библиотеки (GLEW, GLFW) и это больше не проблема.
DirectX возможно даст вам больше возможностей, но там много заморочек с Windows-специфичными вещами, т.к. DirectX работает через технологию COM. Поначалу будет непривычно.

Я бы на вашем месте начал с OpenGL и посматривал на Vulkan. Знание OpenGL полезно ещё тем, что проще будет использовать родственные API, например WebGL, если захотите писать внутрибраузерный код.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1

Ni55aN

OpenGL и DirectX нельзя сравнивать, так как первый только для графики, а второй для всего (Direct3D для графики)

OpenGL
+ крассплатформенный (десктоп, мобайл, веб)
— для работы со звуком, вводом, сетью нужно искать соответствующие инструменты. Может отразиться на времени разработки

DirectX
— только Windows, xBox и т.п.
+ все инструменты в одном виде, готовое взял и пользуйся

Как по мне, создавать движки в наше время дело дорогостоящее и неоправданное, так как есть много готовых вариантов. Среди них немало поддерживают D3D + OpenGL, многие только OpenGL. Так что в плане охвата платформ OpenGL лучше.

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

Сравнение 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 vs. DirectX: что использовать для разработки игр?

OpenGL vs. DirectX: что использовать для разработки игр?

Графические API, такие как OpenGL и DirectX, служат связующим звеном между программным и графическим оборудованием, используемым для игр. Эти API предоставляют стандартизированные методы отображения 2D и 3D графики на экране. За последние несколько десятилетий они стали основополагающими для разработки игр.

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

DirectX против OpenGL: обзор основных характеристик

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

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

DirectX vs OpenGL: область применения API

Прежде чем углубляться в эту тему, важно отметить, что, хотя они оба являются графическими API, OpenGL и DirectX имеют разные сферы применения. OpenGL — это чистый графический API, что означает, что он не имеет дела ни с чем, кроме 2D и 3D графики. DirectX, с другой стороны, представляет собой набор графических, аудио, сетевых и других аппаратных API, которые работают вместе.

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

OpenGL vs DirectX: платформы

OpenGL — это бесплатный API, управляемый некоммерческой компанией Khronos Group, в то время как DirectX производится компанией Microsoft. DirectX работает в основном на Windows и Xbox, а другие платформы, такие как Linux, постепенно получают поддержку, но пока что ситуация плачевна. OpenGL является кроссплатформенным, что делает его пригодным для разработки игр на различных операционных системах и игровых консолях.

Интересно: ATX12VO блоки питания для компьютеров, что это значит?

DirectX vs OpenGL: аппаратные ресурсы

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

DirectX vs OpenGL: документация

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

Использование OpenGL и DirectX для разработки игр

DirectX vs OpenGL

Разработчики создали множество красивых и хорошо оптимизированных игр на современном рынке, используя как OpenGL, так и DirectX. Есть несколько моментов, которые следует учитывать при выборе API для 2D/3D графики. Некоторые разработчики просто полагаются на тот инструмент, с которым им удобнее всего работать.

OpenGL или DirectX: платформы

Мы уже коснулись платформ, но это очень важный момент для разработчиков. Если вы хотите создавать игры для Nintendo Switch, Playstation 4 или Linux, вам придется работать с OpenGL или другим API с их поддержкой. DirectX создан для Windows и Xbox и имеет ограниченную совместимость с другими системами.

OpenGL или DirectX: совместимость с движком

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

OpenGL или DirectX: простота использования

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

Интересно: Что такое стандарт HDR10+ и его отличие от Dolby Vision?

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

OpenGL или DirectX: графические возможности

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

OpenGL или DirectX: производительность в играх

Игра на компьютере

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

Единственный способ выяснить, какой из этих API работает лучше, — это тестирование. Благодаря совместимости Unity с обоими API, мы можем создать проект и протестировать образец игры с обоими API, чтобы определить эталон производительности.

Эти тесты были проведены как с 2D, так и с 3D графикой, чтобы убедиться, что различия в конвейерах не являются существенным фактором. Каждый тест длится 120 секунд обычного игрового процесса, и для определения производительности измеряется количество кадров в секунду. Все тесты проводились на одном и том же компьютере.

Тест производительности 3D: Микроигра Unity Carting

Unity carting

Unity Carting Microgame — это бесплатный шаблон, который содержит все необходимое для создания простой гоночной игры. К нему прилагаются учебники, но нас больше интересует сама игра. Мы создали микроигру Carting с использованием OpenGL и DirectX, чтобы сравнить их производительность, и результаты оказались следующими:

Интересно: Дуплекс в принтере почему это необходимость

Наименьшее Наибольшее Среднее
DirectX 331 848 365.05
OpenGL 247 819 283.7

Тест 2D производительности: Платформер на Unity

Как и микроигра «Картинг», микроигра «Платформер Unity» бесплатна и снабжена отличными инструментами для обучения. Как и ожидалось, 2D-игра в наших тестах работает лучше, чем 3D, но вы можете оценить результаты сами.

Наименьшее Наибольшее Среднее
DirectX 599 850 767
OpenGL 302 604 515

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

OpenGL или DirectX 11: вывод о производительности

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

DirectX или OpenGL: что использовать для разработки игр?

Выбор правильного графического API зависит от нескольких факторов. DirectX является наиболее широко используемым графическим API. Многие разработчики игр создают свои игры для Windows и Xbox, а затем переносят их на OpenGL для других платформ. Если вы публикуете игру исключительно за пределами Windows и Xbox, возможно, вам будет выгодно использовать OpenGL с самого начала.

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

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

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