2016-02-06 17 views
0

Я только что начал использовать прямой подсчет в попытке переместить жидкостное моделирование, над которым я работал, на графический процессор. Я нашел очень похожий (если не идентичный) вопрос here, однако кажется, что разрешение моей проблемы не такое же, как у них; У меня действительно есть правильный код CopyResource! Как и в вставленном вопросе, я получаю только буфер, заполненный 0, когда копируется с GPU. Я действительно не вижу ошибки, поскольку я не понимаю, как я могу выйти за пределы границ. Я собираюсь извиниться за массовый объем вставки кода, но я хочу быть уверенным, что у меня нет неправильной настройки.DirectX 11 - вычислить шейдер, скопировать данные с графического процессора на 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); 
 
}

рассылает шейдер Compute после того как я начать кадр и, прежде чем я конец кадра. Я играл с перемещением вызова диспетчеризации шейдеров за пределами конечной сцены и до настоящего момента, но ничего не влияет на процесс. Кажется, это не видно!

+0

Вы уверены, что он работает без ошибок, когда включен режим Debug Layer? (См. D3D11_CREATE_DEVICE_DEBUG). –

+0

Включение флага «Отладка» для устройства ограничивает количество предупреждений о не загружаемых файлах PDB; никаких предупреждений или ошибок, связанных с вычислительным шейдером/буферами –

ответ

0

Святые Куры Я исправил ошибку! Я создавал вычислительный шейдер для другого указателя ID3D11ComputeShader! D: Работает как шарм! Pheew Жаль и спасибо Адаму!