Я работаю над личным проектом, который, как и многие проекты XNA, начался с карты смещения ландшафта, которая используется для генерации набора вершин, которые отображаются в вызове Device.DrawIndexedPrimitives()
.
Я обновил пользовательский VertexDeclaration
, но сейчас у меня нет доступа к этому коду, поэтому я опубликую немного более старый, но парадигматически идентичный (?) Код.
Я определяю VertexBuffer
как:
VertexBuffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
VertexBuffer.SetData(vertices);
, где 'вершины' определяются как:
VertexPositionNormalTexture[] vertices
I 'У нас также есть два индексных буфера, которые меняются местами на каждой итерации Update ().В вызове Draw()
я установил буферы GraphicsDevice
:
Device.SetVertexBuffer(_buffers.VertexBuffer);
Device.Indices = _buffers.IndexBuffer;
Игнорируя, как я надеюсь, нерелевантные строки кода, у меня есть метод, который проверяет внутри ограничивающей фигуры, чтобы определить, является ливершина находится в пределах определенного радиуса курсора мыши и поднимает или опускает эти позиции вершин в зависимости от того, какая клавиша нажата.Моя проблема в том, что VertexBuffer.SetData()
вызывается только один раз при инициализации класса контейнера.
Изменение позиций вершин массива VertexPositionNormalTexture[]
не отражается на экране, хотя значения позиций вершин изменяются.Я считаю, что это связано с вызовом VertexBuffer.SetData()
, но вы не можете просто вызвать SetData()
с массивом вершин после его изменения.
После повторного изучения того, как обрабатывается IndexBuffer (2 буфера,поменялся местами и перешел в SetData()
в Update()
время), я думаю, что это должен быть способ обработки VertexBuffer
манипуляций, но работает ли это?Есть ли более подходящий способ?Я видел еще одну ссылку на подобный вопрос здесь, но ссылка на источник была на MegaUpload, так что ...
Я попробую мою идею VertexBuffer.Swap()
, но я также видел ссылки на DynamicVertexBuffer
и интересно, какой выигрыш есть?Предполагается, что производительность снижается, но для редактора ландшафта я не вижу в этом слишком большого компромисса, если я могу динамически манипулировать данными вершин.
Я могу опубликовать больше кода, но я думаю, что этовероятно, недостаточно понимания того, как установлены буферы устройства или данные передаются в них.
РЕДАКТИРОВАТЬ: Решение, предложенное ниже, является правильным.Я скоро опубликую свой код.