我正在開發一個個人項目,與許多XNA項目一樣,它的起始地形位移貼圖用於生成一個在Device.DrawIndexedPrimitives()
調用中呈現的頂點集合。用於地形編輯器的XNA VertexBuffer
我已經更新到自定義VertexDeclaration
,但我現在無法訪問該代碼,所以我會發布稍微老一點的,但範例相同的(?)代碼。
我定義VertexBuffer
爲:
VertexBuffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
VertexBuffer.SetData(vertices);
其中「頂點」的定義是:
VertexPositionNormalTexture[] vertices
我也得到了在每個更新換兩隻指數緩衝區()迭代。在Draw()
電話,我設置GraphicsDevice
緩衝區:
Device.SetVertexBuffer(_buffers.VertexBuffer);
Device.Indices = _buffers.IndexBuffer;
忽略我希望是什麼的代碼無關的線條,我有一個邊界形狀內進行檢查,以確定是否頂點是在一定半徑範圍內的方法鼠標光標的位置,並根據按下哪個鍵來升高或降低頂點位置。我的問題是VertexBuffer.SetData()
只在容器類的初始化時被調用一次。
修改VertexPositionNormalTexture[]
陣列的頂點位置不會反映到屏幕上,儘管頂點位置的值會發生變化。我相信這與VertexBuffer.SetData()
調用相關,但在修改頂點數組後,您不能簡單地使用頂點數組調用SetData()
。
後重新檢查IndexBuffer如何(在Update()
時間2個緩衝區,交換和傳遞到SetData()
)處理,我想這應該是處理VertexBuffer
操作的方式,但工作的呢?有更合適的方法嗎?我在這裏看到另一個類似問題的參考,但鏈接到源代碼是在MegaUpload,所以...
我會嘗試我的VertexBuffer.Swap()
想法了,但我也看到引用DynamicVertexBuffer
,想知道增益有?性能據說會受到影響,但對於地形編輯器來說,如果我可以動態地操作頂點數據,我並不認爲這是一個過大的折衷。
我可以發佈更多的代碼,但我認爲這可能是缺乏對如何設置設備緩衝區或數據流式傳輸給他們的理解。
編輯:下面提出的解決方案是正確的。我會很快發佈我的代碼。
我使用兩個索引緩衝區,以適應LOD頂點激活/停用。這也很好地說明了你所說的關於SetData是一個相當昂貴的操作。我把我的地形看作象限,有很多層次的子四邊形,所以這對我的頂點緩衝區來說可能是一個很好的範例。無論如何,我正在嘗試您提出的一些建議,並會在明天報告。 – 2012-02-17 04:35:09
將頂點/索引緩衝區劃分爲小節還允許您選擇性渲染地形的某些部分,並更改特定節的LOD。通過計算攝像機的分段距離和(sectionPosition - cameraPosition)的點積與攝像機的前向矢量的距離,可以在攝像機後面剔除緩衝區,並在遠處設置較低的LOD。 – 2012-02-17 17:44:52