簡體   English   中英

Direct3D C ++ API如何更新頂點緩沖區?

[英]Direct3D c++ api how to update vertex buffer?

那么如何使用IASetVertexBuffers方法將頂點緩沖區中的更新值綁定到設備對象中呢? 在調用Draw()Present()之前還會更改此緩沖區中的值嗎? 還會根據緩沖區中的這些新值來更新圖像嗎?

要由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 :: 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是要放入緩沖區的新頂點數據。

這是一種更新頂點緩沖區的方法,在該方法中,您將上傳一組全新的頂點數據並丟棄先前的內容。 還有其他更新頂點緩沖區的方法。 例如,您可以保留當前內容並僅修改某些值,或者可以僅更新頂點緩沖區的某些區域而不是整個區域。

每種方法都有其自己的用法和性能特征。 這完全取決於您的數據是什么以及您打算如何使用它們。 該NVIDIA演示文稿提供了有關針對不同用途更新緩沖區的最佳方法的一些建議。

是的,您將需要在Draw()Present()之前調用this和IASetVertexBuffers以查看當前幀的更新結果。 在調用IASetVertexBuffers之前,您不一定需要更新頂點緩沖區的內容。 這些可以按照任何順序排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM