Обработка блоков в ландшафте в стиле Minecraft (d3d / c ++)

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

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

Я нашел эту статью, которая рассматривается часть теории, лежащей в основе реализации того, что я хочу реализовать, но я никогда раньше не использовал октодеревья, поэтому я не мог извлечь слишком много из исходного кода. Если октодеревья действительно подходят, то где лучше всего о них узнавать? Большинство моих поисков в Google приводили только к сообщениям в блогах о теории с небольшими примерами реализации или без них.

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

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


Во-первых, если вы используете Minecraft в качестве справочника, подумайте об их использовании кусков и свяжите это с Oct-деревьями. Minecraft делит свой мир на более мелкие части для обработки огромного количества информации, которая требуется для хранения, поэтому используйте Oct-деревья для организации этих данных, которые будут храниться. У Гоза очень точное описание того, как работают Oct-tree и Quad-tree, поэтому используйте его информацию в качестве справки.

Еще одна вещь, которую следует учитывать, — это то, что вы на самом деле не хотите рисовать каждый куб на экран, так как это приведет к увеличению частоты кадров. Используйте Object Culling, чтобы рисовать на экране только видимые кубы. Опять же, если вы думаете, что Minecraft; Вы когда-нибудь сталкивались с ошибкой, когда вы можете видеть сквозь блоки и под миром? Это потому, что Minecraft рисует только верхний слой блоков. При таком большом количестве объектов на экране было бы целесообразным вложить средства в поиск объектов, используя как усеченную область камеры, так и запрос окклюзии.

Для получения информации об использовании DirectX я бы порекомендовал любую книгу Фрэнка Луны. Я сам владею этой книгой, и она никогда не покидает меня при программировании в DirectX. http://www.amazon.com/Introduction-Game-Programming-Direct-9-0c/dp/1598220160/ref=sr_1_3?ie=UTF8&qid=1332478780&sr=8-3Я настоятельно рекомендую эту книгу, так как я узнал почти все Я знаю о DirectX из него.

При поиске в Google я нашел эту ссылку, в которой обсуждается отбраковка окклюзии, потому что Luna не покрывает отсечение окклюзии, а только отсечение усеченной вершины. Я слышал, что серия Programming Gems много упоминается, но я не могу подтвердить ее название лично. http://http.developer.nvidia.com/GPUGems/gpugems_ch29. html

Надеюсь, это поможет.


Окт-деревья довольно просты, особенно выровненные по оси, такие как в шахте.

По сути, это просто трехмерное расширение четырехугольного дерева. Возможно, вам будет проще сначала узнать о квад-дереве.

Чтобы дать вам быстрый обзор квад-дерева; в основном вы начинаете с квадрата. А теперь представьте, что в этот квадрат помещается гораздо меньший квадрат. Если вы хотите построить дерево квадрантов, представляющее его, вы сначала делите исходный квадрат на 4 квадрата равного размера.

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

Теперь, если вы представляете, что ищете конкретный квадрат внутри большего квадрата, вы можете быстро увидеть бонус в виде дерева квадратов. Вместо того, чтобы искать каждый возможный квадрат в дереве квадратов (эквивалентный поиску каждого пикселя в текстуре), теперь вы можете проверить первые 4 квадранта, чтобы увидеть, содержат ли они его. Если это так, вы можете проверить его 4 субквадранта и так далее, пока не найдете самый маленький квадрант, полностью содержащий ваш квадрат (или пиксель). Таким образом, вы выполняете гораздо меньше тестов, чтобы найти свой объект.

Теперь окт-дерево в основном то же самое, но вместо того, чтобы кодировать квадраты в квадраты, вы теперь кодируете кубы в кубы. Каждый куб можно разделить на 8 меньших октантов (отсюда и название октант-дерево).

Преимущество октант-деревьев в том, что зная, с какого октанта вы начинаете, вы можете легко пропускать лучи через Oct-tree для поиска коллизий (так как октант либо полный, либо частично заполнен, либо пуст). Если октант пуст, вы проходите прямо через него, а затем проверяете октант на другой стороне. Если он частично заполнен, вы проверяете его субоктанты и так далее, пока не найдете либо полный октант (т.е. вы попали в твердый куб и визуализируете его), либо полностью пройдете через октант, и, следовательно, не будет куба для рендеринга. . Так работает майнкрафт (все равно догадываюсь;)). Это также хороший способ быстрого рендеринга воксельных данных, который все больше людей рассматривают в наши дни как возможный будущий механизм рендеринга.

Надеюсь, это немного поможет! 🙂

1


Окт-деревья и квад-деревья полезны для отбраковка частей вашей геометрии для рендеринга. Minecraft использует блоки рендеринга 16x16x16, чтобы разбить ландшафт на управляемые части.

Еще один метод, который следует учитывать, — это создание экземпляров. Создание экземпляров — это когда вы указываете графическому процессору отрисовывать объект несколько раз в разных местах. Он используется для визуализации толпы, деревьев и всего, что имеет одинаковую геометрию, но у вас их много.

http://msdn.microsoft. com/en-us/library/windows/desktop/bb173349 (v = vs.85) .aspx

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter03.html

Вот статья, в которой автор дублирует средство визуализации minecraft в OpenGL 4. Хотя код не будет применяться к вашему случаю, методы (отбраковка окруженных кубов и т. д.) могут быть применены к модулю визуализации Directx. .

http://codeflow.org/entries/2010/dec/09/minecraft-like-rendering-experiments-in-opengl-4/

Дон Не дайте себя обмануть блочной графикой и некачественными текстурами. Minecraft — чрезвычайно сложный рендерер, и вам нужно придумать способы обработки огромного количества задействованных элементов. Например, даже «маленькая» часть мира, скажем, блоки 100x100x100 — это 1 миллион блоков. Передача каждого блока в GPU как отдельную сетку убьет ваш GPU. Средство визуализации Minecraft намного сложнее, чем большинство шутеров от первого лица, если вы перейдете к технологиям.

Оцените статью
Gamicon.ru
Добавить комментарий