2014-10-19 26 views

回答

7

要由CPU更新頂點緩衝區,必須先創建一個動態頂點緩衝區,以允許CPU寫入它。爲此,請撥打ID3D11Device::CreateBuffer並將Usage設置爲D3D11_USAGE_DYNAMICCPUAccessFlags設置爲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::MapID3D11DeviceContext::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之前,您不一定需要更新頂點緩衝區內容。這些可以以任何順序。

+0

這是一個錯誤的方式來動畫的東西,因爲當我嘗試這個,我的三角形角落適當移動,但它在這個動畫過程中閃爍。 – 2014-10-21 17:28:20

+1

它可能是也可能不是根據您的數據更新緩衝區的最有效方式,但現在它應該可以正常工作。你的閃爍可能是因爲你在渲染過程中沒有雙緩衝。我看到你提出了另一個問題,所以我們可以在那裏解決它。 – megadan 2014-10-21 22:39:29

+1

理想情況下,您不會通過修改幾何圖形設置動畫效果,因爲效率不高。理想情況下,您使用靜態IB/VB,然後通過轉換和可編程着色器應用移動和動畫。在某些情況下,動態幾何提交是有意義的(通常是地形和門戶系統),在這種情況下,您應該查看[DirectX Tool Kit]中的''PrimitiveBatch'類(http://go.microsoft.com/fwlink/ ?LINKID = 248929)。 – 2014-10-23 20:16:02