Подтвердить что ты не робот

Какую 3D-графику я должен использовать для реального игрового движка?

Я программист на С++ с очень обширным опытом программирования на сервере. На данный момент мне очень скучно, и я решил заняться новой областью: программирование 3D-игр для учебных целей. Кроме того, я думаю, что этот учебный проект может оказаться хорошим резюме в будущем, если я решит работать в этой области.

Вместо того, чтобы создавать 3D-движок с нуля, я решил подражать точно так же, как я могу использовать существующий: World of Warcraft. Если вам интересно, почему (не стесняйтесь пропустить это):

  • Это игра в реальном мире.
  • Все текстуры, модели и то, что еще не сделано (мне не интересно узнать, как нарисовать текстуру с помощью Photoshop или что-то еще)
  • Их форматы файлов были более или менее полностью реконструированы
  • Уже существует идентичный проект с открытым исходным кодом (wowmapview), на который я могу посмотреть, есть ли у меня проблемы.

ok, это было длинное предисловие. Теперь мой главный вопрос: Должен ли я использовать DirectX, OpenGL, библиотеки обертки, такие как sdl или что?

Какой самый используемый в реальном мире?

И что-то еще, что меня озадачивает: World of Warcraft, похоже, использует оба! Фактически, обычно он использует DirectX, но вы можете использовать opengl, запустив его с помощью переключателя "-opengl" через командную строку.

Это что-то общее в играх? Почему они это сделали? Я думаю, что это большая работа, и, по моему мнению, никто не использует OpenGL (очень мало кто знает о секретном переключателе вообще).

Если это что-то обычно делается, программисты обычно создают свою собственную "оболочку" для 3D-движка, что-то вроде SDL, сделанного в доме, и на основе switch/#defines/whatnot решить, какую функцию API в конечном итоге вызывать (DirectX или OpenGL)? Или эта функциональность уже встроена в sdl (вы можете переключаться между DirectX и OpenGL по желанию)?

И, наконец, есть ли у вас какие-нибудь книги?

Спасибо!

4b9b3361

Ответ 1

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

Вместо того, чтобы создавать 3D-движок с нуля, я решил подражать точно так же, как я могу использовать существующий: World of Warcraft.

Однако я хотел сосредоточиться на реальном 3d и рендеринге, а не на интерфейсе, поэтому я не думаю, что буду использовать его [lua] для этого проекта.

Из этих двух фрагментов я могу сказать, что вы не пытаетесь подражать игровому движку. Просто 3D-рендеринг backend. Это не то же самое, а часть бэкэнда рендеринга очень мала по сравнению с полным игровым движком.

Это, кстати, может помочь ответить на один из ваших вопросов:

World of Warcraft, кажется, использует оба! Фактически, обычно он использует DirectX, но вы можете использовать opengl, запустив его с помощью переключателя "-opengl" через командную строку.

Да, они реализовали оба. Объем работы, который нужно сделать, небезразличен, но, по моему опыту, рендеринг, на мой взгляд, составляет не более 10% от общего кода, как правило, меньше. Так что это не то, что оскорбительно реализовать несколько.

Более того, часть программирования игрового движка сегодня не самая большая часть. Это основная часть активов (и это включает в себя большинство игровых программ. Большинство сценариев lua рассматриваются на этой стороне вещей, например)

Для WoW поддержка OSX означала OpenGL. Так они и сделали. Они хотели также поддерживать устаревшее оборудование... Поэтому они поддерживают аппаратное обеспечение уровня DX8. Это уже 3 бэкэнда. Я не осведомлен о том, сколько из них реально реализует, но все это сводится к тому, к какой клиентской базе они хотят достичь.

Несколько back-end в игровом движке - это то, что более или менее необходимо для масштабирования для всех графических карт/ОС/платформ. Я не видел ни одного реального игрового движка, который не поддерживал бы несколько бэкендов (даже первые партийные заголовки, как правило, поддерживают альтернативный сервер для целей отладки).

ok, это было длинное предисловие. Теперь, мой главный вопрос заключается в следующем: Должен ли я использовать DirectX, OpenGL, библиотеки-обертки, такие как sdl или что?

Хорошо, это сильно зависит от того, что вы хотите выбраться из него. Я бы добавил, что ваш список опций не совсем завершен:

  • DirectX9
  • DirectX10
  • DirectX11
  • OpenGL < 3.1 (до удаления устаревших API)
  • OpenGL >= 3.1
  • OpenGL ES 1.1 (только если вам нужно. Он не программируется)
  • OpenGL ES 2.0

Да, эти API отличаются друг от друга, и вам нужно решить, с какими из них вы хотите справиться.

Если вы хотите изучить самые основы 3D-рендеринга, любой из них может работать. OpenGL < 3.1 имеет тенденцию скрывать множество вещей, которые в конечном счете должны произойти в коде пользователя для других (например, Матричные манипуляции, см. этот подключаемый файл).

В DX SDK есть множество примеров, которые помогают понять основные понятия, но они также склонны использовать последние и самые большие возможности DX, когда это не обязательно необходимо при запуске (например, используя шейдер Geometry для визуализации спрайтов..)

С другой стороны, большинство руководств GL имеют тенденцию использовать функции, которые по существу не работают на современном оборудовании (например, glBegin/glEnd, выбор/выбор,... см. список вещей, которые были удалены из GL 3.1 или этот другой плагин) и, как правило, заглатывают неправильные концепции для многих вещей.

Какой самый используемый в реальном мире?

Для игр DirectX9 сегодня является стандартом в мире ПК. Далеко.

Тем не менее, я ожидаю, что DirectX11 захватит больше доли на рынке, так как это позволит использовать более многопоточную работу. Это, к сожалению, значительно сложнее, чем DX9.

никто не использует OpenGL в любом случае (очень мало кто знает о секретном коммутаторе вообще).

Спросите владельцев Mac, что они думают.

Вопрос: действительно ли вы думаете, что поставщики оборудования будут тратить любую энергию на драйверы OpenGL, если это действительно так (я понимаю, что обобщаю ваш комментарий, извините)? есть реальное использование этого мира. Тем не менее, в играх мало. И Apple делает OpenGL более уместным через iphone (хорошо OpenGL ES, действительно).

Если это что-то обычно делается, программисты обычно создают свою собственную "оболочку" для 3D-движка,

Обычно это полная часть конструкции двигателя. Имейте в виду, что он не абстрагирует API на том же уровне, что обычно больше "притягивает это со всеми его колокольчиками и свистами". Какой алгоритм рендеринга, применяемый для этой ничьей, имеет тенденцию быть конкретным.

Это, однако, очень зависит от игры. Если вы хотите понять лучше, вы можете посмотреть на UE3, он просто получил выпущен бесплатно (пиво) для некоммерческого использования (у меня нет посмотрел на него еще, поэтому я не знаю, выставили ли они бэкэнды, но это стоит посмотреть). Чтобы вернуться к моему комментарию, что игровой движок не просто означает 3D, посмотрите на это.

Ответ 2

Я думаю, что основным преимуществом OpenGL над DirectX является переносимость. DirectX работает только на окнах. Однако это часто не проблема (многие игры работают только в Windows).

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

Если вы собираетесь блокировать в Windows с DirectX, и вы готовы/заинтересованы в обучении С# и управляемому коду, я нашел XNA и чрезвычайно простой платформой для изучения. Это позволяет вам изучать большинство концепций, не имея дело с множеством очень сложных деталей DirectX (или OpenGL). Вы все еще можете использовать шейдерный код и полностью использовать DirectX, но в гораздо более дружественной среде. Это было бы моим советом, но опять же, вам нужно переключиться на С# (заметьте, вы также можете поместить это в свое резюме).

Ответ 3

Возможно, вам захочется взглянуть на некоторые проекты, которые инкапсулируют низкоуровневый 3d api в интерфейс более высокого уровня, независимый от api, такой как Ogre3D. Поскольку вы делаете это, чтобы узнать, я предполагаю, что вы, вероятно, будете более интересны в реализации деталей низкого уровня самостоятельно, но вы, вероятно, могли бы многому научиться из такого проекта.

Ответ 4

если вас действительно интересует только часть рендеринга, я могу предложить ogre3d. он чист, С++, проверен и кросс-платформен. Я использовал его в двух проектах и ​​по сравнению с другими впечатлениями (например, крутящий момент3), мне понравилась хорошая поддержка (учебники/вики/форум) и не столь крутая кривая обучения. Я думаю, что кто-то может также многому научиться, глядя на исходный код и концепции, которые они использовали в дизайне. есть также сопровождающая книга, которая немного устарела, но она хороша для начала.

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

поэтому, если вы действительно хотите сначала коснуться 3d-рендеринга, я бы взял некоторые компьютерные графические книги (gpu gems, shaderx) и увидел некоторые учебники и демонстрации в Интернете и начал создавать свою собственную базовую структуру. это для опыта, и я думаю, вы узнаете больше всего из этого подхода. по крайней мере, я...

Ответ 5

Я работаю над OpenGL прямо сейчас (как на Windows, так и на Mac).

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

Unity3D работает на всех (Mac, ПК и iPhone, веб-плеер и т.д.) и позволяет сосредоточиться на том, что делает игру, игру. В довершение всего, это быстрее, чем все, что я мог бы написать. Вы код для него в С#, Java (EDIT: сделайте этот JavaScript) или Boo. (EDIT: поддержка Boo была удалена)

Я только что использовал Unity для создания демонстрации для клиента, который хочет что-то сделать в OpenGL, поэтому он также использует его в реальном мире.

-Крис

PS: Версия Unity Indie недавно стала бесплатной.