0
我剛開始使用Direct計算來嘗試將我一直在研究的流體模擬移動到GPU上。我發現了一個非常相似(如果不相同)的問題here但是似乎我的問題的解決方案與他們的問題不一樣;我確實有我的CopyResource正確的方法!與粘貼的問題一樣,從GPU複製時,我只能得到填充0的緩衝區。我真的不能看到這個錯誤,因爲我不明白我能超越界限。我要爲大量的代碼粘貼道歉,但我想確保我沒有任何設置錯誤。DirectX 11 - 計算着色器,將數據從GPU複製到CPU
輸出緩衝器,無人機系統緩衝區設置
outputDesc.Usage = D3D11_USAGE_DEFAULT;
\t outputDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
\t outputDesc.ByteWidth = sizeof(BoundaryConditions) * numElements;
\t outputDesc.CPUAccessFlags = 0;
\t outputDesc.StructureByteStride = sizeof(BoundaryConditions);
\t outputDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; \t
\t result =_device->CreateBuffer(&outputDesc, 0, &m_outputBuffer);
\t outputDesc.Usage = D3D11_USAGE_STAGING;
\t outputDesc.BindFlags = 0;
\t outputDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
\t result = _device->CreateBuffer(&outputDesc, 0, &m_outputresult);
\t D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
\t uavDesc.Format = DXGI_FORMAT_UNKNOWN;
\t uavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
\t uavDesc.Buffer.FirstElement = 0;
\t uavDesc.Buffer.Flags = 0;
\t uavDesc.Buffer.NumElements = numElements;
\t result =_device->CreateUnorderedAccessView(m_outputBuffer, &uavDesc, &m_BoundaryConditionsUAV);
在我的幀循環運行的Shader
HRESULT result;
\t D3D11_MAPPED_SUBRESOURCE mappedResource;
\t _deviceContext->CSSetShader(m_BoundaryConditionsCS, nullptr, 0);
\t _deviceContext->CSSetUnorderedAccessViews(0, 1, &m_BoundaryConditionsUAV, 0);
\t _deviceContext->Dispatch(1, 1, 1);
\t // Unbind output from compute shader
\t ID3D11UnorderedAccessView* nullUAV[] = { NULL };
\t _deviceContext->CSSetUnorderedAccessViews(0, 1, nullUAV, 0);
\t // Disable Compute Shader
\t _deviceContext->CSSetShader(nullptr, nullptr, 0);
\t _deviceContext->CopyResource(m_outputresult, m_outputBuffer);
\t D3D11_MAPPED_SUBRESOURCE mappedData;
\t result = _deviceContext->Map(m_outputresult, 0, D3D11_MAP_READ, 0, &mappedData);
\t BoundaryConditions* newbc = reinterpret_cast<BoundaryConditions*>(mappedData.pData);
\t
\t for (int i = 0; i < 4; i++)
\t {
\t \t Debug::Instance()->Log(newbc[i].x.x);
\t }
\t _deviceContext->Unmap(m_outputresult, 0);
HLSL
struct BoundaryConditions
{
\t float3 x;
\t float3 y;
};
RWStructuredBuffer<BoundaryConditions> _boundaryConditions;
[numthreads(4, 1, 1)]
void ComputeBoundaryConditions(int3 id : SV_DispatchThreadID)
{
\t _boundaryConditions[id.x].x = float3(id.x,id.y,id.z);
}
我分派計算着色我開始幀之後和之前,我結束幀。我已經在處理結束場景之外,在現在之前移動着色器調度調用,但似乎沒有任何影響過程。似乎無法找出這一個!
當您啓用調試層時,您是否確定它運行時沒有錯誤? (請參閱D3D11_CREATE_DEVICE_DEBUG)。 –
爲設備啓用調試標誌只標記一堆關於未加載PDB文件的警告;計算着色器/緩衝區周圍沒有警告或錯誤 –