Рисование огромного количества текстурированных кубов в XNA 4.0

Я пытаюсь написать собственный многопользовательский клиент Minecraft Classic в XNA 4.0, но я совершенно сбит с толку, когда дело доходит до рисования мира в игре. Каждый блок представляет собой куб в трехмерном пространстве, и он может иметь разные текстуры с каждой стороны. Я читал в Интернете, и выяснили, что для того, чтобы куб имел различную текстуру с каждой стороны, каждой грани нужен собственный набор вершин. В итоге получается 24 вершины для каждого куба, и если у вас есть мир, состоящий из 64 * 64 * 64 кубов (или, возможно, даже больше!), То получается много вершин.

В моем исходном коде я разбил карту текстур, которую я имел, на отдельные текстуры и применил их перед рисованием каждой стороны каждого куба. Мне сказали, что это очень дорогостоящий подход, и что я должен хранить текстуры в одном файле и просто использовать UV-координаты для отображения определенных подтекстур на куб. Однако это не сильно повлияло на производительность, так как количество вершин просто слишком велико. Мне также сказали собрать вершины в VertexBuffer и нарисовать их все сразу, но это тоже не сильно помогло, и иногда вызывает исключение, когда количество вершин превышает максимальный размер буфера. Любая попытка, которую я пытался заставить кубы совместно использовать вершины, также терпела неудачу, что приводило к огромному замедлению и сбоям в работе кубов.

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

Вот метод, который я использую для рисования кубиков. У меня есть два глобальных списка List и List , один для вершин и один для индексов. При рисовании я перебираю все кубы в мире и использую RenderShape для тех, которые не пусты (например, Air). Класс формы, который у меня есть, вставлен ниже. Закомментированный код в методе AddVertices - это попытка заставить кубы совместно использовать вершины. Когда все вершины кубов добавлены в список, данные вставляются в VertexBuffer и IndexBuffer, и вызывается DrawIndexedPrimitives.

Честно говоря, я, вероятно, делаю это совершенно неправильно, но я действительно понятия не имею как это сделать, и нет руководств, которые действительно описывают, как рисовать множество объектов, есть только очень простые. Мне пришлось самому придумать, как переделать BasicShape, чтобы получить несколько текстур.

Форма: http://pastebin.com/zNUFPygP

5
задан Bevin 15 January 2011 в 20:00
поделиться