Большей частью фэйки. Изредка врапперы, транслирующие, либо отключающие функции DX10, для того, чтобы игра, которая требует наличия дх10 считала, что он есть и запустилась.
Как архитектор часто работаю в различных 3D программах а-ля Макс, Майя.
кстати и там и там работаю через OpenGL
Очень интересная и познавательная статья.
Всегда фанател от OpenGL, но он умирал умирал
… и вот мы одни оставались на острове, а вокруг плавали акулы и голосами друзей говорили — Уря! мы переписали свое двигло с DX7 на DX8…
… акула делала круг и говорила — Уря! Мы переписали свой двиг с DX8 на DX9…
Я молчал и только поменял в шейдерах нормали на халфы, так как по вчерашнем драйвере было сказано что GF6800 выполняет с ними операции за такт…
И правильно делают.
Имхо, знание OpenGL открывает знание графического ускорителя, а знание ДХ его награмождено доп. знаниями структуры классов. Как это бывает у МС, всё слишком нагромаждено.
(Речь идет не о «hello world» уровне, а о более сложных решениях).
И ещё, работа с OGL требует знания математики, чем выше уровень — тем проще работать. В ДХ всё сводится к использованию Vector, Point, Angel и т.д. (хотя матрицы тоже есть)
Вообще-то делают как раз не правильно. Потому что по крайней мере на мехмате МГУ учат исключительно устаревшим частям OpenGL, которые как раз полностью и выкинули в новом стандарте.
Насколько я знаю, разработчики любят DirectX не за видео, а за звук.
Т.е. использовать им DirectX проще для реализации всего, нежели придумывать и реализовывать связки OpenGL + OpenAL + обработку клавиатуры, мыши, *падов…
Нужен именно что, SDK для новичков включающий работу со всем оборудованием. А не только туториалы для создания чайника.
DirectX любят издатели, а не разработчики, так как поголовно сидят на «бонусах» от майкрософта. А разработчики часто игры с двумя рендерами выпускают (WoW, FarCry тот же), только вот под OpenGL рендером на других платформах никто издавать их не хочет.
Мой знакомый, именно разработчик. Сам он сидит на Linux. Он мне и пояснял чем лучше DirectX связки FOSS библиотек. (Работает в компании где был сделан Hitman)
Понимаю, самому бы хотелось что бы все стали использовать сплошняком FOSS, но это жизнь… За что купил, за то и продаю информацию.
причем тут FOSS? никто не мешает выпускать проприетарное. На голом OpenGL никто ничего не пишет давно, есть куча библиотек и движков более высого уровня под теми ж LGPL, позволяющими их использовать в проиприетарном софте. Взять тот же Ogre3D — создать на нем игру команде разработчиков дело недолгое, выпустить можно как угодно и под какими угодно лицензиями, можно спуститься на уровень ниже и пинать на SDL, не надо морочиться с OpenAL и OpenGL, SDL сама все сделает, по сути это уровень DX
Не знаю на счет FarCry а вот за WoW не скажите… он и DirectX и OpenGL юзает. Спросите в ТП близов, Mac версия на OpenGL, и елсли верить слухам, то портированние игры Mac → Linux тоже будет с реализацией OpenGL на линукс версиях
Не вижу ничего страшного юзать OpenGL+DirectX для звука/клавы. При необходимости звук/клаву портировать намного проще чем перенести графику с DIrectX на OpenGL :-)
По статье. Как верно подметил автор, сила OpenGL в его расширениях, но в них же и его слабость. Писать графический движок, оптимизированный для конкретной видеокарты, в зависимости от тех расширений, которая она поддерживает, не выгодно. Постоянный проблемы со стандартизацией расширений, на это много времени уходит. Помниться, когда только начинал изучать OpenGL (тогда еще был 1.1), был очень удивлен, что расширения от nVidia и стандартизированный GL_EXT по работе с массивом вершим работают с разной скоростью, которая достаточно заметна. ATI рекомендует свое, nVidia свое, а Кронос за ними не поспевает.
Изначально хотел писать курсовую на DirectX, была куплена книжка, был выкачан SDK, но время шло, я не садился… И вот времени до сдачи остаётся не много, я сажусь разбираться, вижу сотню строк маловразумительного кода для окошка без ничего. И довольно толстую книжку с основами. И тут одногруппник подкидывает мне Qt Creator с готовым примером графики на OpenGL, а в нём вся эта муть уже красиво обёрнута в GLWidget (да-да, в стандартной поставке!). Остаётся от него унаследоваться и переопределить несколько методов (paintGL(), resizeGL() и initializeGL()). И всё! Рисуй в них сразу функциями OpenGLя.
Курсач по комп.графике был спокойно написан за неделю (даже с бОльшей, чем нужно функциональностью) и успешно сдан. Компилится (и работает!) под Windows и Linux.
На самом деле мне просто очень понравилось писать в QT. Та простота и элегантность, с которой виджет с OpenGL-визуализацией был вставлен в графический интерфейс (прямо в редакторе форм) и связан с другими элементами (через сигналы и слоты конечно). Писать эту программку было приятно. Ещё и получил профит в зачётку :-)
Ну а D3D нужно ещё научить заработать в линухах. Winelib мог бы помочь, но насколько — не знаю. В данном же случае после небольших манипуляций с кодом (прописывание лишний раз пары #include'ов), удалось добиться того, что один и тот же код (без правок) компилировался в обоих ОСях (подозреваю, что в линухе стоит просто более капризная версия GCC, чем та, что идёт в поставке с виндовым Qt Creator'ом) и работал идентично. Хотя на самом деле мне это было не нужно ;-)
DirectX это комплект всего для мультимедиа: графика, видео, звук, ввод\вывод (включая всякие там рули и педали), сеть и мультиплеер и т.п.… как уже было замечено выше это частенько и является причиной выбора Direct3D, как части комплекта.
Статья понравилась. Пока что, я на стороне OpenGL. Еще не хватает сравнения готовых вещей, таких как эффекты и работа с контроллерами (рулями, джойстиками).
И, вопрос, если в OpenGL всё так замечательно, почему крупные разработчики не так часто его используют?
Я думаю MS не смогла бы им заплатить, т.к. доходы от продажи игр на куче платформ куда выше.
Получают бонусы от Майкрософт. В статье написанно об этом. Сейчас тенденция такая, что игры все больше и больше разрабатываются под консоли. Под маки тоже хорошо идут. Конкуренция есть и это очень хорошо.
К сожалению есть проблема с тем что для ноутбука ASUS с ATI 3470 для WinXP нет драйвера для OpenGL 3 ни на сайте ASUS ни ATI, а вот для Win7 — драйвер для OpenGL 3 качается через WinUpdate. В общем Microsoft ущемляет немного владельцев Windows с драйверами OpenGL, договорившись с производителями железа.
В DirectX — есть библиотеки для работы с сетью, звуком, загрузки моделей и т.п. В OpenGL это нужно делать руками или с помощью сторонних библиотек (но результат лучше чем у DirectX, по итогу, если руки прямые).
По DirectX — много литературы (книг) на английском с примерами, по OpenGL как и по любому OS литературы гораздо меньше.
Самая главная бяка перед использованием расширений OpenGL проверяйте есть они на конкретном железе или нет, многие это забывают. И тогда в примерах на железе поддерживающем частично новую спецификацию и часть расширений — пропадают текстуры на некоторых объектах и т.п. неприятности случаются.
>… но результат лучше чем у DirectX, по итогу, если руки прямые…
А это как — «лучше»? У Вас данные по сети будут бегать быстрее? Или в более правильном порядке? Или звук будет более «стерео»? Или модель загрузиться более красиво?
В DirectX есть встроенная оптимизация и если глубоко некопаться в алгоритмах на начальных стадиях DirectX выглядит лучше. Но если хорошо покопаться в алгоритмах программирования и ручками оптимизировать — что рисовать и как в OpenGL, то после этого по качеству освещения он лучше.
Не совсем корректно но сравнивая даже PS3 и XBOX360 — коридорные шутеры атмосфернее в PS3 (из-за теней), а вот много объектов на открытом пространстве лучше рисует XBOX360 (не намного лучше и рисует с меньшим количеством полигонов). Ну и PS3 — это урезанная OpenGL 2.0, даже не 2.1 — которая была бы достойным ответом усовершенствованному DirectX 9 в XBOX360.
OpenGL vs DirectX, победителя нет. Новый DirectX объявляют раньше, но вот доступы новые возможности нового DirectX становятся сразу после выхода нового железа которое идёт уже с драйверами в которых есть новые расширения OpenGL равные по возможностям новому DirectX. А через некоторое время новые расширения OpenGL попадают в основной стандарт OpenGL.
Странное вы пишете. Освещение оно как напишете в шейдере, такое и будет. PS3 это железка, на нее и надо смотреть, а не на цифры после запятой. Про сравнения платформ через атмосферность — тут вообще без коментариев.
IMHO, автор всё же немного не прав. И вот в чём. Direct3D он на то и Direct, что это прямой интерфейс к железяке. То есть, в прямом смысле прямой. Сама там NVIDIA или AMD, когда пишет драйвер для Direct3D, сама реализует всякие там Direct3DDevice'ы и прочие прелести. В Microsoft же тоже не олухи полные сидят, и тоже заботятся о том, чтобы и технические коврижки были. Бонусы, конечно, бонусами, но если всё тормозило бы безбожно, то и девелоперов бы не привлекло.
OpenGL же он носит ярко выраженную клиент-серверность. Он более гибкий, и драйверы для него не подразумевают реализацию львиной доли функциональности собственными силами… Ну. Разве только AMD фанатствует и вместе со своими драйверами, половину X-Window подменяет своей библиотекой. Поэтому, OpenGL менее прямой интерфейс имеет с железякой, поэтому, всё же, когда речь идёт о статической pipeline, несколько более тормозной, чем Direct3D. Хотя, конечно, в наш век универсальных шейдеров эти тормоза особой роли уже и не играют, но исторический контекст, imho, именно такой.
Майкрософт до эпохи игрушек не такой уж и влиятельной контрой была, чтобы нечто изобретать чисто для подавления конкурентов. Всё же технологическое рациональное зерно в Direct3D было.
Где вы углядели в OpenGL «клиент-серверность»? OpenGL не имеет никакого отношения к X Window.
Direct в названии DirectX подразумевало что доступ к железу более прямой чем в WinAPI, к примеру GDI если дело идет о двухмерной графике.
Насчет медленности OpenGL — традиционно MS поставляла кривую реализацию которая была стабильно медленнее чем DirectX. Что даже приводило к тому что в Wine некоторые игры работали значительно быстрее. Но к самому API это не имеет никакого отношения.
А при чём тут реализация от MS? OpenGL тормозил и на UNIX'ах. Вполне себе так неплохо :) Просто к нему никогда требований особой интерактивности не предъявляли, вот он неспеша и работал. А про клиент-серверность OpenGL прямым текстом написано в спецификации. Он вполне может работать и с удалённой станцией визуализации. И к X-Window он прямое отношение имеет, потому что он в нём является подсистемой.
Direct же более прямой не только, чем WinAPI, но и вообще прямее всех прямых. Ибо головной боли с ним, особенно в многопточных приложениях, до фига и больше.
Драйверы и тулкиты по-разному устроены. У DirectX философия такая, что драйвер просто реализует всю функциональность DirectX (например, вы в сеансе терминального сервиса не сможете запустить Direct3D приложение, потому что драйвер не умеет), а у OpenGL философия такая, что драйвер может кое-что в 3D-рендеринге ускорять. Это вносит определённые различия в функционирование. OpenGL — это некий сервер, которому шлются команды через библиотеку, он там что-то себе выдумывает, как эти команды лучше выполнить, а потом зовёт железяку через драйвер. DirectX просто всегда зовёт драйвер железяки, который уже сам разбирается, что с командами делать.
О, да вы, я смотрю прямо таки переполнены знаниями. OpenGL — ничто иное, как API. И с X-ми никак не связано, просто возможно включение в конфиге иксов GLX, но не надо путать GL и GLX, это разные вещи.
Эх, все это хорошо и красиво, но… Писали мы как-то приложения по выводу видео на многомониторную систему (до 8 мониторов). И оказалось, что под Direct3D это все хорошо и работает, а под OpenGL — тоже работает, но выдает 10-12 FPS (это на серваке уровня двухпроцессорного ксеона, 4 Гб ОЗУ, Nvidia GTX295 и т.д. ). И никак больше! Сам я код не писал и деталей не знаю, но у нас группа из трех программеров потратила несколько месяцев на попытки заставить OpenGL работать столь же производительно. Да, мы качали драйвера, пробовали разные версии OpenGL, разные версии винды и видеокарт, код свой оптимизировали от и до. По нулям… На одном мониторе — еще куда ни шло, на нескольких — абзац.
В итоге, из-за этих проблем с производительностью пришлось от OpenGL отказаться полностью. Я думаю, по тем же причинам Direct3D является дефолтным (а иногда и единственным) движком в большинстве современных игр. Как бы нарисовать чайник с освещением из одной точки или курсач по графике на OpenGL — легко и прятно, а вот миллионы треугольников в реальной игре на 100fps — очень трудно.
Там два вида апи, первый — именно как вы и сказали, свой апи. Второй — враппер на ним реализующий опенгл. Реально, все нормальные конторы используют первый.
> Как бы нарисовать чайник с освещением из одной точки или курсач по графике на OpenGL — легко и прятно, а вот миллионы треугольников в реальной игре на 100fps — очень трудно.
А это уже ОБС, были проблемы, что мол издатель хотел, чтобы они бросили linux платформу, но на самом деле там всё портирование на Линукс делает в основном один человек, и он сказал, что не откажется от этого дела ttimo.vox.com/library/post/id-software-and-linux.html
А так видимо придется в любом случае очень многим делать. Хотя бы для того, чтобы игру, написанную на 11DXе можно было пускать в XP, переключив рендер на DX9, тут уж можно заодно и openGL рендер написать для *nix'ов
Насколько я слышал на самом деле Кармак как раз не очень волнуется по-поводу того какой API использовать, так как код зависимый от OpenGL/DirectX на самом деле составляет очень малую долю всего движка.
Ха, собственно практически на этом все реальные конторы использующие огл по вин (имеющие клон на маке не считаются — там огл рендер идет бесплатным бонусом от портирования).
Дело в том что нужно учитывать особенности OpenGL при отрисовке большого количества треугольников. Основная идея в том чтоб отрисовать их за минимальное количество обращений к API, то есть желательно всего за несколько вызовов с большим количеством треугольников сразу.
Разрешите поправить и дополнить немного?
а) COM также имеет стандарт на ABI, поэтому методы через COM-интерфейсы могут быть вызваны из любого языка: Си, С++, VB, Python, скрипты, да хоть Фортран. COM-интерфейс — это простой си-образный массив обычных __cdecl-функций.
б) внутри Dx уже нет COM-а, начиная с 5ой версии, он просто снаружи сделан совместимым с COM, т.к. это независимая от языка и относительно удобная для писания на Си технология.
в) В Windows начиная с XP «родной» OpenGL рендерит с ускорением, но оказывается несколько медленнее DX от того, что клиентская-сервер OpenGL реализован поверх самого DX.
Вообще эти самые расширения — самая большая палка о двух концах, из за этого, например, игростроители нелюбят игры в Линукс портировать. Считается, что там вечные проблемы с драйверами и многие расширения глючат. Впрочем пока это не так уж далеко от истины
Ну вот знаю Blizzard свои игры портирует. Хотя многие да, хитрят, используя wine. Кстати, а почему тормозит то? В Линуксе игры, запущенные через Вайн могут иметь артефакты отрисовки и некоторые отключенные фичи, но вот тормозят они редко.
OpenGL используют только энтузиасты. Он умер в тот момент, когда Khronos плюнул в лицо сообществу, выпустив OpenGL 3, и всем стало ясно, что архитектура больше развиваться не будет. Жив и используется серьезными разработчиками только OpenGL|ES, используемый на разнообразных portable устройствах.
Direct3D гарантирует стабильность. Я не хочу иметь дело с зоопарком расширений, кривых драйверов и документации, содержащей куски десятилетней давности. Я хочу использовать новое железо сразу, а не ждать, когда каждая из организаций-членов Khronos после долгих перетягиваний одеяла выпустит очередную версию с кучей отсутствующих возможностей, потому что не может их поддержать. С Direct3D 10 я могу писать один код для всех вендоров разом.
Веры в Microsoft у меня больше, чем веры в Khronos (который в принципе широко известен в узких кругах неадекватностью стандартов).
Avoid design by committee. There should be a single person with final say in the design… and this person should have good architectural experience and instincts.
И тем не менее, просто скажите «нет» D3D до тех пор, пока Windows не научится использовать драйвера Gallium3D и M$ не портирует D3D на Gallium3D. Иначе мы имеем всего-лишь очередной vendor lock-in.
Ну кстати gallium3D может запросто решить очень многие проблемы, ибо оно может предоставлять для юзерсейса различные API: openGL (на данный момент реализуют openGL 2.1), direct3D, любое другое API, которое ещё даже не родилось, а для драйверов нужно будет писать бэкенды на так называемых state tracker'ах. А кому надо, те могут напрямую использовать state tracker'ы.
Пока есть полурабочий драйвер для некоторых нвидиевских интеловских и атишных карточек, но даже это впечатляет, при учете, что первая публичная версия лишь весной появилась.
openGL vs DirectX — это уже давно не холивар. все зависит от того на кого направлено ваше приложение, если это конечно бизнес.
а на чем учиться — дело 10тое. Но по факту проще найти и больше зарабатывать будучи мастером DirextX.
Если выбрали своей профессией программирование — DirectX. Если нет — то какая разница? =)
Поправьте, если я не прав, но вот это пипец: развитие OpenGL идёт так: появляется новая фишка, производитель реализовывает её в своём драйвере и документирует доступное расширение. Приложения могут использовать новые функции прямо сейчас, не дожидаясь включения в официальную спецификацию.
Это полный пипец. Потому что приложние, по-видимому, должно лювиную долю времени проверять все и вся на наличие соответствующих расширений и, видимо, вручную кодировать N! вариантов, когда отсутствуют разные комбинации этих расширений?
Можно потребовать конкретную версию OpenGL, где все нужные расширения поддерживаются сразу. Или же программа может, в случае недоступности нужного ей расширения, отказаться работать.
То есть в таком случае, это, в принципе, ничем не отличается от залоченой в мажорной верии функциональности и аргумент о том, что OpenGL крут наличием расширений, в принципе, сводится на нет
Да нет, в реальной жизни все не так страшно. К примеру проверяем или присутствует расширение для шейдеров, если есть то используются шейдеры, иначе fixed pipeline. Это больше похоже на включение/выключение графических опций (которые и так обычно присутствуют в играх, и в тех что под DirectX) в зависимости от наличия расширений. И N! вариантов не надо для этого.
Было бы интересно статистику использования в ПО OGL и DX (я имею ввиду десктоп платформу, где потенциально эти системы равноцены).
Как-то смотрел несколько сайтов со статистикой крупным по игровым тайтлам (ссылок уже не найду к сожалению) — игры или оба апи поддерживают или DX only. Ну и обычно по умолчанию рендер DX.
Судя по этому у OGL на десктопе сейчас не лучшие времена.
А вот GL ES это уже другая песня :)
Вот, скажем, разработчики изначально кроссплатформенных Nexuiz, или Sauerbraten используют только OGL. Посмотрите, кстати, в них отличная графика… которой как и почти всем опенсурсным проектам нехватает хороших дизайнеров.
Статистика для комерческих игр 99.9% — dx, остальное ogl. Реально я вот могу перечислить меньше десятка игр последнего десятилетия использующих последний.
раз уж тут собрались OpenGL'щики, спрошу: есть проблема с отсечением объектов в, собственно, OpenGL
дабы не писать длинных комментов, прошу последовать по ссылке и по возможности подсказать решение данной проблемы
з.ы. пробовал обращаться с этой проблемой к разным людям с разных форумов, но ни одного толкового ответа так и не нашёл
я хочу увидеть то, как они работают на XP, как говорится в этом топике, но в комментах было сказано, что огл работает поверх директа => в XP не может быть геометрических шейдеров…
так почему же MS не сделала DX10 под XP? я не сильно верю в маркетинговый ход и т.д., а то об этом бы много кричали и доказывали бы, что в XP можно такое замутить, но не было доказательств, только крики.
так тогда почему же OGL с геометрическими шейдерами должен работать?
Маркетинговый ход. Шейдеры — это просто программы, которые загружаются в память видеокарты. Если операционная система позволяет что-то в видеокарту загружать, то и шейдеры любой разновидности должны работать. Технических ограничений тут нет.
DirectX 10, конечно сам по себе просто может быть неприспособленным для XP. Может, какие-то особые сервисы нужны или особенности ядра… Или .Net какая навороченная. Но как бы… Ничто не мешает OpenGL'ю работать нормально.
вот сейчас специально поставлю visual c++ express, скомпилю найденное демо геометрических шейдеров, соберу и запущу на xp, стоящей в виртуалке (реальной xp нету).
сами посудите — если просто передаются _вызовы_ API хостовой машине, то вообще при чем тут драйвера? тем более если виртуальное железо далеееко != реальному.
Насколько я знаю, в виртуалке такое сделать пока не выйдет. В VirtualBox точно не выйдет. Там поддерживается OpenGL до 2.1, вроде. А значит — без геометрических шейдеров. Тут нужно на живом железе проверять.
openGL в базисе своем дает только базисные, а точнее атомарные функции.
чтобы отрисовать текструрированый треугольник надо сделать десятки вызовов
( загрузка текстры, заливка, бинд MMU, vertex-index buffer, описать формат входа, настроить кучу матриц и… поехали )
успешное овладение openGL дает сильный буст в скорости( будем считать что на 20-30% меньше CPU bound чем ДХ)
но есть одно мелкое отличие — многим людям знакомо понятие DIP-call — это то зло( синхра проца-драйвера-видео ) которого надо избегать.
В DX эта чтука обходиться легко и просто потому что предсказуема.
В openGL место появления DIP НЕ ПРЕДСКАЗУЕМО
Пример — bind vertex buffer — задаем цвета, вершины, нормали…
В разных дровах, для разных карт и от разных лет DIP может произойти( или не произойти ) в разных местах…
Не буду вспоминать грусные времена когда для АТИ\нВидии писались не то что разные шейдеры — на разных языках…
Ну да ладно, чет я расписался.
В общем будем считать что openGL — для энтузиастов впереди планеты всей. Супер скорось, супер возможности… Месяцы, а то и годы обучения возможностям, правильному использованию АПИ и сопуствующей математики…
Посему всегда и везде над прослойкой openGL висит большой большой user-engine API.
Их еще называют графическими двиглами :)… :)
В тоже время D3D по сути и есть эта обертка упрощений разработки и использования над openGL.
Посему, в неком смысле, D3D можно назвать даже «графическим контролером»
он не low-level, он довольно сильно абстрагирован и несет в себе много базисных фенек
Он проще для серьезных вещей
Сравнение OpenGL и Direct3D