Я пытаюсь написать собственный многопользовательский клиент Minecraft Classic для XNA 4.0, но я совершенно ошарашен, когда дело доходит до рисования мира в игре. Каждый блок представляет собой куб в трехмерном пространстве, и он может иметь разные текстуры на каждой стороне. Я читал в Интернете и обнаружил, что для того, чтобы у куба была разная текстура на каждой стороне, каждому лицу нужен свой набор вершин. Это дает в общей сложности 24 вершины для каждого куба, и если у вас есть мир, состоящий из 64 * 64 * 64 кубов (или, возможно, даже больше!), То получается много вершин.
В своем исходном коде я разделил карту текстур на отдельные текстуры и применил их перед рисованием каждой стороны каждого куба. Мне сказали, что это очень дорогой подход, и я должен держать текстуры в одном файле и просто использовать UV-координаты для отображения определенных субтекстур на куб. Это не сильно повлияло на производительность, поскольку количество вершин просто слишком велико. Мне также сказали собрать вершины в VertexBuffer и нарисовать их все сразу, но это тоже мало помогло, и иногда вызывает исключение, когда число вершин превышает максимальный размер буфера. Любая попытка заставить кубы делить вершины также потерпела неудачу, что привело к значительному замедлению и глючным кубам.
Понятия не имею, что с этим делать. Я довольно хорош в программировании в целом, но любой вид трехмерного программирования или разработки игр полностью ускользает от меня.
Вот метод, который я использую для рисования кубов. У меня есть два глобальных списка List<VertexPositionTexture>
и List<int>
, один для вершин и один для индексов. При рисовании я перебираю все кубы в мире и выполняю RenderShape на тех, которые не пусты (например, Air). Класс формы, который я имею, вставлен ниже. Закомментированный код в методе AddVertices - это попытка заставить кубы совместно использовать вершины. Когда все вершины кубов добавлены в список, данные вставляются в VertexBuffer и IndexBuffer и вызывается DrawIndexedPrimitives.
Честно говоря, я, вероятно, делаю это совершенно неправильно, но я действительно не представляю, как это сделать, и нет учебных пособий, которые на самом деле описывают, как рисовать много объектов, только очень простые. Мне пришлось выяснить, как переделать BasicShape, чтобы иметь несколько текстур самостоятельно.
Форма:
http://pastebin.com/zNUFPygP