我正在从事一个个人项目,与许多 XNA 项目一样,该项目从地形置换贴图开始,该贴图用于生成在Device.DrawIndexedPrimitives()
调用中呈现的顶点集合。
我已更新为 custom VertexDeclaration
,但我现在无法访问该代码,因此我将发布稍旧但在范式上相同 (?) 的代码。
我将 a 定义VertexBuffer
为:
VertexBuffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
VertexBuffer.SetData(vertices);
其中“顶点”定义为:
VertexPositionNormalTexture[] vertices
我还有两个在每次 Update() 迭代时交换的索引缓冲区。在Draw()
通话中,我设置了GraphicsDevice
缓冲区:
Device.SetVertexBuffer(_buffers.VertexBuffer);
Device.Indices = _buffers.IndexBuffer;
忽略我希望不相关的代码行,我有一个方法可以检查边界形状以确定顶点是否在鼠标光标的某个半径内,并根据按下的键升高或降低这些顶点位置。我的问题是VertexBuffer.SetData()
在容器类的初始化时只调用一次。
修改VertexPositionNormalTexture[]
数组的顶点位置不会反映到屏幕上,尽管顶点位置的值已更改。我相信这与VertexBuffer.SetData()
调用有关,但是您不能SetData()
在修改顶点数组后简单地调用它。
SetData()
在重新检查了 IndexBuffer 的处理方式(2 个缓冲区,有时交换并传入Update()
)之后,我认为这应该是处理VertexBuffer
操作的方式,但这行得通吗?有没有更合适的方法?我在这里看到了对类似问题的另一个参考,但源链接在 MegaUpload 上,所以......
我会尝试我的VertexBuffer.Swap()
想法,但我也看到了参考DynamicVertexBuffer
并想知道有什么收获?性能据说会受到影响,但是对于地形编辑器,如果我可以动态地操作顶点数据,我认为这不是太大的权衡。
我可以发布更多代码,但我认为这可能是对设备缓冲区的设置方式或数据流式传输方式缺乏了解。
编辑:下面提出的解决方案是正确的。我会尽快发布我的代码。