OpenGL или DirectX?
Зависит от ваших текущих знаний и пожеланий, особенно от того, насколько вы готовы разбираться с каждой их технологий.
OpenGL это кроссплатформенное API, раньше было не очень удобно начинать работу с ним на Винде, сейчас доступны различные библиотеки (GLEW, GLFW) и это больше не проблема.
DirectX возможно даст вам больше возможностей, но там много заморочек с Windows-специфичными вещами, т.к. DirectX работает через технологию COM. Поначалу будет непривычно.
Я бы на вашем месте начал с OpenGL и посматривал на Vulkan. Знание OpenGL полезно ещё тем, что проще будет использовать родственные API, например WebGL, если захотите писать внутрибраузерный код.
OpenGL и DirectX нельзя сравнивать, так как первый только для графики, а второй для всего (Direct3D для графики)
OpenGL
+ крассплатформенный (десктоп, мобайл, веб)
— для работы со звуком, вводом, сетью нужно искать соответствующие инструменты. Может отразиться на времени разработки
DirectX
— только Windows, xBox и т.п.
+ все инструменты в одном виде, готовое взял и пользуйся
Как по мне, создавать движки в наше время дело дорогостоящее и неоправданное, так как есть много готовых вариантов. Среди них немало поддерживают D3D + OpenGL, многие только OpenGL. Так что в плане охвата платформ OpenGL лучше.
То есть однозначно выбрать нельзя, нужно учитывать какие платформы вам нужны и как рассчитываете силы/время. Может проще и надежнее будет взять UE4 или ему подобный движок. На крайних случай Urho3D
Когда мы иной раз говорим другим разработчикам игр, что в нашей игре Overgrowth мы использовали OpenGL, нам недоуменно возражают: зачем, разве будущее не за DirectX? Когда мы говорим представителям видеокарт, что используем OpenGL, температура в помещении опускается на 10 градусов.
Это нас озадачивает. Среди веб-разработчиков считается хорошим тоном ругать стандартные технологии, такие как Silverlight, Flash или ActiveX, зато всячески приветствуется кросс-платформенная разработка. Ни один уважающий себя спец не испытывает восторга от работы с закрытыми стандартами типа документов Word или серверов Exchange. И что же произошло с этим миром, что инженеры вдруг принялись не только рукоплескать проприетарному API Microsoft, но ещё и активно ругать его открытого конкурента?
Прежде чем мы объясним, почему мы за OpenGL, немного истории.
Что такое OpenGL
Что такое DirectX
Если судить по сегодняшнему игровому рынку, эта стратегия себя оправдала. Большинство главных игр для PC используют DirectX и работают на Windows и Xbox 360. За редкими исключениями они не работают на конкурирующих платформах, таких как PlayStation, Mac OS или Wii. Так Microsoft теряет довольно серьёзные рынки, а мы ставим важный вопрос:
Почему все используют DirectX?
Рынок начал смещаться в сторону DirectX под воздействием двух факторов: агрессивная реклама DirectX при запуске Xbox 360 и Windows Vista, которая заставила многих усомниться в будущем OpenGL, и оголтелое преувеличение достоинств DirectX. Эти факторы были усилены описанным эффектом обратной связи, и в результате OpenGL почти полностью исчезла из главных игровых новинок.
1. Эффект обратной связи и порочные круги
В среде Windows графические драйверы DirectX поддерживаются лучше, чем OpenGL. Причиной этого является порочный круг под названием «поддержка производителей». Чем больше разработчиков по той или иной причине переходит с OpenGL на DirectX, тем меньше производители видеокарт получают сообщений об ошибках в драйверах OpenGL; следовательно, они становятся хуже, и ещё больше разработчиков уходит с OpenGL на DirectX. Круг замыкается.
Факт и в том, что в DirectX разбирается больше программистов графики, чем в OpenGL; следовательно, создать игру под DirectX дешевле, потому что для этого требуется меньше затрат на обучение. И это ещё один порочный круг: чем больше игр использует DirectX, тем больше программистов должны её изучить. Чем больше программистов изучают DirectX, тем дешевле DirectX обходится игровым проектам в сравнении с OpenGL.
2. Vista и сомнения в отношении OpenGL
При выпуске Vista Microsoft начала активно сеять в пользователях сомнения и неуверенность в отношении OpenGL.
В 2003 году Microsoft покинула Наблюдательную комиссию по архитектуре OpenGL, показав тем самым, что её больше не интересует судьба этой библиотеки. На SIGGRAPH (конгресс специалистов по графике) и WinHEC (конференция разработчиков аппаратного обеспечения под эгидой Microsoft) представители корпорации заявили, что в Windows Vista OpenGL будет поддерживаться на самом минимальном уровне, чтобы только обеспечить обратную связь с приложениями XP. OpenGL будет накладываться поверх DirectX, что приведёт к резкому снижению производительности. Это вызвало самую настоящую панику в рядах OpenGL, в результате чего многие профессиональные программисты графики перешли на DirectX.
Когда Vista наконец вышла, оказалось, что эти заявления не соответствовали действительности: поставщики создали быстрые устанавливаемые клиентские драйверы (ICD), вернувшие системе нативную поддержку OpenGL. Комиссия по OpenGL разослала письмо с доказательствами, что OpenGL по-прежнему в строю и ничем не уступает Direct3D на Vista. К сожалению, нужный Microsoft результат уже был достигнут: доверие к OpenGL серьёзно пошатнулось.
3. Лживые рекламные кампании
Далеко не все игры поддерживают этот маркетинговый фарс Microsoft. Многие настоящие профессионалы графики, такие как Джон Кармак (John Carmack), относятся к DX10 скептически. Он однажды сказал: «Лично я не стал бы сейчас переходить на что-то вроде DX10. Я бы подождал, когда всё немного утрясётся и для этого появится действительно объективная необходимость».
Так почему же мы используем OpenGL?
Общеизвестно, что вызовы отрисовки в OpenGL быстрее, чем в DirectX. Верить нам на слово необязательно: на этот счёт существуют официальные презентации NVIDIA. Благодаря расширениям поставщиков новые функции видеопроцессоров на OpenGL начинают поддерживаться раньше. OpenGL сразу даёт прямой доступ ко всем новым графическим решениям на всех платформах, тогда как DirectX лишь предоставляет выборочные снимки на новых версиях Windows. Та же мозаичная технология (tesselation), которую Microsoft активно продвигает в DirectX 11, уже три года существует для OpenGL в качестве расширения. Я не знаю, какие новые технологии появятся в ближайшие годы, но я точно знаю, что первыми они появятся в OpenGL.
2. OpenGL кроссплатформенная
Когда Джона Кармака спросили, работает ли Rage под DirectX, он ответил: «Нет, это OpenGL, хотя мы использовали API в стиле D3D [на Xbox 360] и CG для PS3. Вы знаете, технологиям довольно неинтересно, какой вы используете API и какого поколения ваши технологии. API интересуется буквально несколько файлов, а миллионы строк кода совершенно безразличны к вашей платформе». Если можно достичь всех платформ с OpenGL, то зачем себя искусственно ограничивать, привязываясь к DirectX?
3. У OpenGL больше перспектив на игровом рынке
Для понижения цен и повышения качества необходима конкуренция. Монополия Microsoft на игровом рынке очень вредна и игрокам, и разработчикам.
Cможет ли OpenGL вернуть утраченные позиции?
В 1997 году была очень похожая ситуация. Microsoft начала агрессивную рекламную кампанию в пользу Direct3D, и однажды утром все проснулись и узнали, что она и быстрее, и лучше, чем OpenGL. Ситуация стала меняться после того, как Крис Хэкер (Chris Hecker) опубликовал открытое письмо против DirectX. Вскоре после этого Джон Кармак опубликовал свою знаменитую оду OpenGL, которую тут же подкрепил делом: перевёл все игры Id Software на OpenGL. Так он раз и навсегда доказал, что DirectX совершенно необязательна для трёхмерных игр высшей категории.
Однако за последние несколько лет этот урок оказался подзабыт. Большинство игровых разработчиков либо поддались чарам маркетологов Microsoft, либо утонули в порочных кругах рыночной конъюнктуры. Настало время отбросить пустые рекламации и модные тренды и посмотреть в глаза правде. Если вы пишете под DirectX, вам приходится либо брать слабую и раздутую DX9, либо жертвовать значительной частью пользовательской базы с DX10 и 11.
С другой стороны, если вы пишете под OpenGL, вы получаете более быструю и мощную графику, чем в DirectX 11, причём на всех версиях Windows, Mac и Linux, а также PS3, Wii, PSP, DS и iPhone. Кроме того, вы получаете всё это в рамках динамично развивающегося стандарта WebGL, который вполне может стать базовым для браузерных игр следующего поколения.
Сравнение 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 нет. Поэтому осваивать с нуля будет сложнее.
Сравнительный тест DirectX 11, OpenGL и Vulkan
На минувшей неделе был представлен API Vulkan, о широкой поддержке которого заявили AMD и NVIDIA. Новый графический интерфейс разрабатывал Khronos Group, консорциум, основанный в 2000 году. Khronos Group отвечает за разработку и поддержку открытых стандартов в сфере мультимедийных приложений на разных платформах и устройствах. Консорциум поддерживают AMD и NVIDIA, а также многие другие компании.
На минувшей неделе была ратифицирована финальная версия 1.0 API Vulkan. AMD и NVIDIA представили соответствующие бета-драйверы. AMD заранее выпустила бета-версию Radeon Software еще 14 февраля. NVIDIA представила драйвер GeForce 356.39, который тоже ориентирован на поддержку API Vulkan.
Подход API Vulkan очень похож на API Mantle. Суть заключается в том, чтобы разработчики получили более глубокий доступ к «железу», чтобы выжать из него максимум. Такой подход позволяет максимально избежать существующих «узких мест». С другой стороны, разработчики должны точно знать, что они делают – например, при работе с памятью. Интерфейс OpenGL не так популярен, как DirectX, но позволяет выжать больше.
Интерфейс API Vulkan в версии 1.0 поддерживается под Windows 7, Windows 8.1, Windows 10, Android и Linux. Разработчики игр пока что не объявили о поддержки в конкретных играх, но здесь стоит дождаться Games Developer Conference, которая будет проводиться с 14 по 18 марта в Сан-Франциско. Из игровых движков пока есть информация о Source 2, который уже поддерживает API Vulkan. Процесс отладки облегчается поддержкой Valve, LunarG и Codeplay.
The Talos Principle
Хорошо, но какая игра или движок поддерживают API Vulkan? Игра The Talos Principle разрабатывалась компанией Croteam, которая и в прошлом была известна поддержкой многих графических API. И в последней итерации игра The Talos Principle не стала исключением – она поддерживает DirectX 9, DirectX 11, OpenGL и теперь Vulkan. Для студии разработчиков Vulkan является пробным шаром, хотя API Vulkan доступен в версии 1.0, поддержка пока находится в бета-стадии. На добавление поддержки разработчики Croteam затратили порядка трех месяцев. Но универсальный характер API позволяет вскоре представить вариант Linux.
API Vulkan теоретически совместим с несколькими платформами – но пока что тесты и сравнения можно провести только под Windows, причем здесь имеются свои ограничения. Реализация пока остается на очень раннем этапе. Путь рендеринга DirectX 11 совершенствовался многие годы, поэтому потенциала для оптимизации здесь уже нет. Здесь ситуация больше зависит от разработчиков драйверов, а именно AMD и NVIDIA. Игра The Talos Principle стала первой с поддержкой Vulkan. Поэтому пока нет возможности сделать сравнительный тест для оценки хорошей или плохой реализации поддержки.
Новые технологии первое время реализуются в примерах, подготовленных производителями. В случае DirectX 12 акцент был выставлен на Draw Calls, тот же тест 3DMark DirectX 12 опирается только на измерение производительности Draw Calls, игры DirectX 12, подобные Star Wars, тоже пытаются задействовать подобную нагрузку. Но The Talos Principle не так сильно зависит от высокой скорости Draw Call, чтобы низкоуровневый API дал большую разницу.
Поддержка API Vulkan версии 1.0 находится на ранней стадии, то же самое касается драйверов AMD и NVIDIA. Оба драйвера, по сути, относятся к бета-версиям, именно так их рассматривают производители GPU. Здесь обычно нет новых улучшений производительности или поддержки новых технологий, так что мы получаем шаг назад. Но как только определенный уровень разработки будет достигнут, драйверы обоих разработчиков GPU получат поддержку Vulkan в финальной версии. Когда это произойдет – не совсем понятно. Но пока ключевые приложения не используют Vulkan и игры с поддержкой API находятся в состоянии бета-версии, так что разработчики GPU могут спокойно дорабатывать свои драйверы.
Для тестов мы взяли нашу тестовую систему для видеокарт. Драйверы видеокарт AMD и NVIDIA мы уже описали выше. В настройках мы выставили максимальный уровень графики, но при этом протестировали и низкие разрешения вплоть до 1.280 x 720 пикселей, чтобы увеличить производительность Draw Call.
Как можно видеть по результатам, API Vulkan дает существенный прирост по сравнению с OpenGL. Но до производительности DirectX 11 новый API не дотягивает. Тому есть несколько причин. С одной стороны, разработка под Vulkan находится в ранней стадии. Это касается и самого API, и драйвера, и игры The Talos Principle. По сравнению с OpenGL новый интерфейс позволяет освободить часть ресурсов и избежать «узких мест». Но DirectX много лет совершенствовался до текущего уровня. В любом случае, потенциал у API Vulkan очень хороший.
Если погрузиться в детали, то визуальных отличий между API Vulkan и DirectX 11 мы не обнаружили. Так что путь рендеринга очень хорошо адаптирован. У текущей реализации The Talos Principle видеокарты с 2 Гбайт памяти получают падение производительности, вероятно, из-за не самой эффективной работы с памятью. Как и Mantle и DirectX 12, API Vulkan может обращаться к ресурсам памяти на более глубоком уровне – сей факт можно рассматривать как преимущество, но он может стать и недостатком, если разработчики не смогут эффективно использовать память.
Несколько разочаровала ошибка в текущем драйвере NVIDIA, из-за которой после каждого теста приходилось перезагружать систему. Без перезагрузки игра «вылетала». Хотя с драйвером AMD мы не обнаруживали подобной ошибки.
Нынешняя реализация API Vulkan кажется обещающей. Пока что для игр на настольных ПК она будет не такой актуальной, поскольку рынок DirectX 11 и 12 очень велик, и по сравнению с тем же DirectX 12 затраты на реализацию могут быть слишком велики, а отдача слишком мала. Но если игры необходимо запускать на разных платформах с разными аппаратными требованиями, Vulkan может сыграть важную роль. В любом случае, следует дождаться реакции со стороны разработчиков игр, иначе мы получаем проблему курицы и яйца, из которой сложно выйти.










