那麼如何使用IASetVertexBuffers
方法更新綁定到設備對象的頂點緩衝區中的值呢?在調用Draw()
和Present()
之前,還會更改此緩衝區中的值嗎?還會根據緩衝區中的這些新值更新圖像嗎?Direct3D C++ api如何更新頂點緩衝區?
0
A
回答
7
要由CPU更新頂點緩衝區,必須先創建一個動態頂點緩衝區,以允許CPU寫入它。爲此,請撥打ID3D11Device::CreateBuffer
並將Usage
設置爲D3D11_USAGE_DYNAMIC
和CPUAccessFlags
設置爲D3D11_CPU_ACCESS_WRITE
。例如:
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = size;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
d3dDevice->CreateBuffer(&desc, initialVertexData, &vertexBuffer);
現在你有一個動態的頂點緩衝,則可以使用ID3D11DeviceContext::Map和ID3D11DeviceContext::Unmap更新。例如:
D3D11_MAPPED_SUBRESOURCE resource;
d3dDeviceContext->Map(vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
memcpy(resource.pData, sourceData, vertexDataSize);
d3dDeviceContext->Unmap(vertexBuffer, 0);
其中sourceData是要放入緩衝區的新頂點數據。
這是更新頂點緩衝區的一種方法,您在上傳一組全新的頂點數據並丟棄以前的內容。還有其他方法來更新頂點緩衝區。例如,您可以保留當前內容並只修改某些值,或者只更新頂點緩衝區的某些區域而不更新整個區域。
每種方法都有其自己的用法和性能特徵。這完全取決於你的數據是什麼以及你打算如何使用它。 This NVIDIA presentation給出了一些關於更新不同用法的緩衝區的最佳方法的建議。
是的,您需要在Draw()
和Present()
之前調用此和IASetVertexBuffers
以查看當前幀的更新結果。在調用IASetVertexBuffers
之前,您不一定需要更新頂點緩衝區內容。這些可以以任何順序。
相關問題
- 1. 更新Direct3D網格的頂點緩衝區的最快方法?
- 2. 在Direct3D中與頂點和索引緩衝區掙扎
- 3. Managed Direct3D:鎖定整個頂點緩衝區
- 4. Direct3D 9.0交錯非fvf頂點緩衝區
- 5. 如何正確地更新DirectX 10中的頂點緩衝區
- 6. 如何更新android上的頂點緩衝區?
- 7. C++頂點緩衝區問題
- 8. OpenGL頂點和緩衝區
- 9. Direct3d頂點緩衝區使用類型,性能和C++放大器?
- 10. 如何以另一種顏色在頂點緩衝區中繪製頂點
- 11. 如何在Direct3d11中從頂點緩衝區中讀取頂點
- 12. DirectX:如何初始化錐體的頂點緩衝區和索引緩衝區?
- 13. 爲什麼這個頂點緩衝區對象無法更新?
- 14. 更新頂點緩衝區導致調試層錯誤
- 15. OpenGL。使用glBufferData更新頂點緩衝區
- 16. DX10 +多個頂點緩衝區,單個索引緩衝區
- 17. LWJGL/OpenGL頂點緩衝區對象
- 18. 動態或靜態頂點緩衝區?
- 19. 帶SDL的頂點緩衝區對象
- 20. 卸載OpenGL中的頂點緩衝區
- 21. Monogame頂點緩衝區代理怪異
- 22. lwjgl沒有繪製頂點緩衝區
- 23. 有多少頂點緩衝區太多?
- 24. 紋理VBOs(頂點緩衝區對象)
- 25. opengl中的頂點緩衝區
- 26. iPhone和頂點緩衝區對象
- 27. 紋理頂點緩衝區對象
- 28. OpenGL:頂點索引緩衝區問題
- 29. OpenGL緩衝區更新
- 30. 從頂點緩衝區句柄獲取頂點
這是一個錯誤的方式來動畫的東西,因爲當我嘗試這個,我的三角形角落適當移動,但它在這個動畫過程中閃爍。 – 2014-10-21 17:28:20
它可能是也可能不是根據您的數據更新緩衝區的最有效方式,但現在它應該可以正常工作。你的閃爍可能是因爲你在渲染過程中沒有雙緩衝。我看到你提出了另一個問題,所以我們可以在那裏解決它。 – megadan 2014-10-21 22:39:29
理想情況下,您不會通過修改幾何圖形設置動畫效果,因爲效率不高。理想情況下,您使用靜態IB/VB,然後通過轉換和可編程着色器應用移動和動畫。在某些情況下,動態幾何提交是有意義的(通常是地形和門戶系統),在這種情況下,您應該查看[DirectX Tool Kit]中的''PrimitiveBatch'類(http://go.microsoft.com/fwlink/ ?LINKID = 248929)。 – 2014-10-23 20:16:02