Имеет ли значение, изучаю ли я OpenGL или Direct3D?

11

Являются ли различия между этими двумя API незначительными деталями реализации, которые означают, что как только я изучу один, я могу использовать его для всего? Или есть причины для изучения одного, а не другого, если я хочу иметь возможность использовать его вообще без необходимости переучивать другой API в будущем? Тот или иной более общий?

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

Есть ли разница в том, как переносимый код будет на разных платформах (операционных системах / архитектурах)? Меня интересует наличие других библиотек, которые работают с ними, и приводит ли одна или другая к уменьшению лицензионных ограничений в более широкой среде. Что-нибудь измеримое, что имело бы значение для того, мог ли один из них быть единственным, который я изучаю, не ограничивая меня.

Trichoplax
источник
2
Хитрый уродец ответ хороший. Если вы хотите изучить Direct3D, вы можете прочитать мою бесплатную книгу «Графический конвейер Direct3D» . Подробности API в основном Direct3D9, но концепции те же. Дело в том, что концепции программирования 3D-графики практически не изменились с конца 1960-х годов. API для выражения этих концепций стали намного умнее.
узаконить

Ответы:

9

Я не думаю, что это имеет большое значение, какой API вы хотите использовать, опираясь на «программную графику». Более важные вещи для изучения - это типичные концепции, которые вы используете при работе с 3D-сценами. Например, вы хотите научиться писать простой (а затем и более сложный) граф сцены. Эти понятия намного важнее, чем конкретные имена методов API, которые вы должны вызывать.

Сравните это при обучении написанию программ. Если вы достаточно хорошо пишете программы, например, на Java, у вас не будет особых проблем с изучением C ++, Objective-C, Swift или другого объектно-ориентированного языка. Потому что это концепции и мышление, которые вы изучаете.

Выбор между OpenGL, Direct3D и Metal - это, прежде всего, выбор операционной системы, на которую вы ориентируетесь. Direct3D в основном доступен на Windows, Metal на OS X и iOS, а OpenGL поддерживается на большинстве систем, включая OS X, iOS, Windows и Linux.

Графическая карта, вероятно, не имеет никакого влияния на это решение, поскольку я не знаю карту, которая поддерживает только одну или две. Если у вас нет выделенной видеокарты, то рендеринг в реальном времени станет проблемой в ближайшее время. Хотя Intel HD Graphics и AMD Companion уже могут сделать довольно много.

Итак, выберите вашу платформу.


Отказ от ответственности: На данный момент я не использовал ни Direct3D, ни Metal.

Нерон
источник
2
> «Если вы неплохо пишете программы, например, на Java, у вас не будет особых проблем с изучением C ++» - это неправда. У всех будут колоссальные проблемы с обучением и использованием C ++. Сравнение его с Java или любым другим безопасным языком совершенно неуместно. Для других языков, которые вы перечислили (Objective-C, Swift или какой-либо другой объектно-ориентированный язык), это утверждение в основном верно.
Отображаемое имя
9

В настоящее время мы находимся в переходе парадигм API.

Старый школьный метод связывания буферов, униформ, атрибутов, макетов и программ как (неявного) глобального состояния и диспетчеризации отрисовок с этим состоянием распространен в D3D11 и OpenGL. Тем не менее, он имеет большие издержки (при проверке состояния и незнании того, что программа хочет делать до последней минуты). Они также не являются потокобезопасными (по большей части).

Вот почему появились новые apis (или скоро появятся) D3D12, наиболее заметными являются vulkan и Metal. Эти API предоставляют больше контроля над программой и позволяют ей заранее объявить, что она хочет делать с помощью командных буферов. Они также позволяют вам гораздо проще управлять своими собственными ресурсами (данными вершин, текстурами ...). Использование их с множеством гораздо проще.

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

  • Если вы хотите что-то, что «просто работает» даже на старом оборудовании, тогда старые школьные API лучше; они также более известны, и вы получите больше помощи по ним в Интернете.

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

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

Я лично не думаю, что это имеет большое значение. Просто выберите тот, который подходит вашему проекту. Я использовал как D3D, так и OpenGL в прошлом. Это понятия, которые имеют значение. Что бы вы ни схватили, вам нужно понять (например):

  • Что такое текстуры и как они используются GPU.
  • Основные понятия разработки графики (вершины, примитивы, фрагменты и т. Д.)
  • Как работает система камер (например, матрицы MVP в OpenGL).
  • Что такое шейдеры и как их правильно использовать.
  • Чем отличается графический процессор от центрального процессора на вашей машине.
  • Каковы различия между моделью памяти GPU и моделью памяти CPU.
  • Что нужно сделать на процессоре, а что выгрузить на графический процессор для обработки.

Как уже упоминалось здесь, мы находимся в процессе перехода к новому набору API-интерфейсов (Vulkan, Metal и т. Д.), Поэтому на данный момент, если вы абсолютно новичок в разработке графики, вероятно, сосредоточиться на GLSL - хорошая идея, поскольку Vulkan собирается воспользоваться этим также.

Что касается переносимости, D3D предназначен только для Windows (ходят слухи, что проект Wine пытается заставить D3D работать под Linux, но пока что это невозможно). OpenGL является кроссплатформенным. Если вы хотите стать мобильным, то OpenGL ES является доступной опцией. Конечно, и OpenGL, и OpenGL ES имеют разные версии, которые поддерживаются не всеми платформами.

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

Sepehr
источник
Direct3D - это то, что вы будете использовать, если программируете для любой консоли Xbox.
узаконить
Что вы подразумеваете под «ничего невозможного»? Wine запускает сотни D3D-программ без проблем и делает это годами. Конечно, есть ошибки и не реализованные части, но это не делает весь API непригодным для использования.
Руслан
0

Я скажу пару слов о рендеринге без видеокарт.

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

Для OpenGL в Linux существует программный растеризатор Mesa. По моему опыту, это работает нормально, если вы не слишком настаиваете, комбинируя странные функции (список отображения + индексированные массивы вершин). Я предполагаю, что их список фактических ошибок высотой в милю. Обязательно проводите непрерывное тестирование!

У меня меньше опыта использования OpenGL в Windows. Отредактируйте ответ, если знаете что-нибудь!

DirectX SDK поставляется с программным растеризатором, который называется «эталонный растеризатор». По моему мнению, это в основном для отладки, но я знаю по крайней мере одного друга, который использовал эталонный растеризатор при разработке DX11 на ноутбуке с поддержкой только DX10. Как уже упоминалось в других ответах, DirectX является только Microsoft.

Andreas
источник
По моему опыту, использование встроенной видеокарты должно быть достаточно для большинства разработок OpenGL под Windows, просто убедитесь, что она поддерживает последнюю версию OpenGL.
Акалтар