簡體   English   中英

DirectX 11-Compute Shader,將數據從GPU復制到CPU

[英]DirectX 11 - Compute Shader, copy data from the GPU to the CPU

我剛剛開始使用Direct計算,試圖將一直在進行的流體模擬移動到GPU上。 我在這里發現了一個非常相似(如果不相同)的問題但是看來我的問題的解決方案與他們的解決方案不同; 我的確有正確的方式來使用CopyResource! 與粘貼的問題一樣,從GPU復制回時,我只會得到一個填充有0的緩沖區。 我真的看不到錯誤,因為我不知道如何達到極限。 對於要粘貼的大量代碼,我將深表歉意,但是我想確保沒有設置錯誤。

輸出緩沖區,無人機和系統緩沖區設置

  outputDesc.Usage = D3D11_USAGE_DEFAULT; outputDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; outputDesc.ByteWidth = sizeof(BoundaryConditions) * numElements; outputDesc.CPUAccessFlags = 0; outputDesc.StructureByteStride = sizeof(BoundaryConditions); outputDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; result =_device->CreateBuffer(&outputDesc, 0, &m_outputBuffer); outputDesc.Usage = D3D11_USAGE_STAGING; outputDesc.BindFlags = 0; outputDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; result = _device->CreateBuffer(&outputDesc, 0, &m_outputresult); D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc; uavDesc.Format = DXGI_FORMAT_UNKNOWN; uavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; uavDesc.Buffer.FirstElement = 0; uavDesc.Buffer.Flags = 0; uavDesc.Buffer.NumElements = numElements; result =_device->CreateUnorderedAccessView(m_outputBuffer, &uavDesc, &m_BoundaryConditionsUAV); 

在我的框架循環中運行着色器

 HRESULT result; D3D11_MAPPED_SUBRESOURCE mappedResource; _deviceContext->CSSetShader(m_BoundaryConditionsCS, nullptr, 0); _deviceContext->CSSetUnorderedAccessViews(0, 1, &m_BoundaryConditionsUAV, 0); _deviceContext->Dispatch(1, 1, 1); // Unbind output from compute shader ID3D11UnorderedAccessView* nullUAV[] = { NULL }; _deviceContext->CSSetUnorderedAccessViews(0, 1, nullUAV, 0); // Disable Compute Shader _deviceContext->CSSetShader(nullptr, nullptr, 0); _deviceContext->CopyResource(m_outputresult, m_outputBuffer); D3D11_MAPPED_SUBRESOURCE mappedData; result = _deviceContext->Map(m_outputresult, 0, D3D11_MAP_READ, 0, &mappedData); BoundaryConditions* newbc = reinterpret_cast<BoundaryConditions*>(mappedData.pData); for (int i = 0; i < 4; i++) { Debug::Instance()->Log(newbc[i].xx); } _deviceContext->Unmap(m_outputresult, 0); 

HLSL

 struct BoundaryConditions { float3 x; float3 y; }; RWStructuredBuffer<BoundaryConditions> _boundaryConditions; [numthreads(4, 1, 1)] void ComputeBoundaryConditions(int3 id : SV_DispatchThreadID) { _boundaryConditions[id.x].x = float3(id.x,id.y,id.z); } 

在開始幀之后和結束幀之前,我調度計算着色器。 我一直在嘗試將着色器調度調用移到最終場景之外和當前示例之前,但是似乎沒有任何影響。 似乎無法弄清楚這一點!

我解決了錯誤! 我正在為另一個ID3D11ComputeShader指針創建計算着色器! D:像魅力一樣! 抱歉,謝謝亞當!

暫無
暫無

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

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