Сравнение Opengl И Direct3D

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

API .

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

Поскольку тема очень холиварная, я постарался сохранить тон максимально нейтральным.



С высоты птичьего полета

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

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

OpenGL - открытый стандарт, разработанный некоммерческой организацией Хронос Групп с участием общественности.

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

В частности, OpenGL — основной API для взаимодействия с графическими процессорами в Linux и Mac OS.

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

Direct3D основан на технологии КОМ .

COM по сути является стандартом двоичного представления компонентов.

Как известно, классы чистого C++ нельзя использовать из других языков программирования, поскольку они не имеют стандартизированного двоичного представления.

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

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

Приложение Direct3D использует указатели на интерфейсы объектов.

Работа с объектом осуществляется путем вызова методов его интерфейса.

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

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

Подробнее о Direct3D 10 ниже.

OpenGL использует обычные функции языка C. Существует стандартизированный АБИ , что означает, что OpenGL можно использовать на любом языке, поддерживающем вызов собственных библиотечных функций (то есть, практически, на любом языке вообще).

OpenGL использует так называемый конечный автомат (конечный автомат).

Результат вызовов функций OpenGL зависит от внутреннего состояния и может его изменить.

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

Аналогом концепции устройства в Direct3D является контекст. Контекст OpenGL привязан к конкретному окну, как устройство в Direct3D. Общим для этих двух API является то, что оба не предоставляют ничего, кроме графики.

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

Те.

они не являются библиотеками высокого уровня.

В наиболее упрощенной форме можно сказать так: OpenGL и Direct3D позволяют рисовать треугольники.

Вот и все.

Дело в том, что треугольники можно рисовать разными способами (текстурами, освещением, трансформациями и т. д.).



Самое важное отличие

Его имя — расширения.

Direct3D по существу фиксирован в одной основной версии.

Любые изменения/дополнения происходят только при выходе следующей версии.

В OpenGL фактический доступный API определяется производителем графического процессора.

Реализация OpenGL позволяет определять расширения базовой спецификации.

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

Фактически, почти вся функциональность OpenGL является расширениями.

Разработка OpenGL происходит следующим образом: появляется новая функция, производитель реализует ее в своем драйвере и документирует доступное расширение.

Приложения могут использовать новые возможности сразу, не дожидаясь включения в официальную спецификацию.

Если это расширение специфично для конкретного производителя, то его имя носит его имя (например, так: GL_NV_point_sprite, где NV означает nVidia).

Если расширение реализуется многими поставщиками, то в имени используется EXT (например, GL_EXT_draw_range_elements).

Со временем, если расширение будет широко использоваться, оно будет стандартизировано в АРБ , а затем содержит в имени ARB (например, GL_ARB_vertex_buffer_object).

Это расширение имеет официальный статус.

Наиболее важные расширения со временем становятся частью базовой спецификации.

Каждая новая версия OpenGL — это, по сути, старая версия + несколько новых интегрированных расширений.

Однако новые функции по-прежнему доступны в виде расширений.

Те.

на самом деле, с точки зрения программы, возможно, не имеет значения, какая это версия OpenGL. Главное, какие расширения доступны.

Версия OpenGL — это просто способ указать, какой набор расширений гарантированно поддерживается.



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

Microsoft произвела радикальный пересмотр API в Direct3D 10. Теперь он имеет более унифицированный и современный вид. Были выброшены некоторые устаревшие вещи, такие как рендеринг фиксированных функций (без использования шейдеров).

Также осуществлен переход на новую модель работы драйверов.

В частности, реализация Direct3D теперь может иметь не только часть пространства ядра, но и часть пространства пользователя.

Это экономит время при переключении пространства пользователя/пространства ядра.

Однако из-за новой модели драйвера Direct3D 10 и выше недоступны в Windows XP. Учитывая все еще очень популярную Windows XP, это весьма печально.

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

Еще одно отличие состоит в том, что до сих пор в API OpenGL не было внесено никаких изменений, не имеющих обратной совместимости.

Любая инновация – это расширение.

Функции, представленные в Direct3D 10, такие как геометрические шейдеры, доступны в OpenGL на любой платформе через расширение или, начиная с OpenGL 3.2, как часть базовой спецификации.

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

Таким образом, у многих сложилось впечатление, что Direct3D 10 недоступен в Windows XP исключительно по политическим причинам, а не из-за каких-либо реальных технических проблем.

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

Теперь о нововведениях в OpenGL 3.x. Начиная с OpenGL 3.0 появилась так называемая модель устаревания.

Некоторые из старых функций, связанных с рендерингом фиксированных функций, а также рендерингом на основе glBegin/glEnd и многими другими устаревшими и неактуальными вещами, были объявлены устаревшими и впоследствии были удалены из основной спецификации 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 был разработан гораздо позже, сразу с учетом ускорения графического процессора.

На момент появления многих пакетов профессиональной работы с графикой Direct3D просто не существовало.



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

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

Причины отказа от OpenGL, скорее всего, снова чисто политические.



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

Примечание.

Эта часть очень субъективна.

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

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

К сожалению, SDK для OpenGL не существует. Поэтому освоить с нуля будет сложнее.

Вот и все.

Удачи вам в развитии! Теги: #api #3d #Работа с 3D-графикой #DirectX #opengl #holywar

Вместе с данным постом часто просматривают: