Чтобы получить доступ к текстуре из процессора (режим чтения), вам нужно создать отдельную промежуточную текстуру, а затем скопировать в нее текстуру.
Это флаги для текстуры только для gpu (обратите внимание, я выставляю счетчик выборок равным 1, так как доступ к БПЛА не разрешен для текстур с несколькими выборками)
D3D11_TEXTURE2D_DESC gpuTexDesc;
gpuTexDesc.Format = DXGI_FORMAT_R32_FLOAT;
gpuTexDesc.Width = 3;
gpuTexDesc.Height = 3;
gpuTexDesc.MipLevels = 1;
gpuTexDesc.ArraySize = 1;
gpuTexDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS |
D3D11_BIND_SHADER_RESOURCE;
gpuTexDesc.SampleDesc.Count = 1;
gpuTexDesc.SampleDesc.Quality = 0;
gpuTexDesc.Usage = D3D11_USAGE_DEFAULT;
gpuTexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
gpuTexDesc.MiscFlags = 0;
Затем вы создаете вторую текстуру для чтения
D3D11_TEXTURE2D_DESC readTexDesc;
readTexDesc.Format = DXGI_FORMAT_R32_FLOAT;
readTexDesc.Width = 3;
readTexDesc.Height = 3;
readTexDesc.MipLevels = 1;
readTexDesc.ArraySize = 1;
readTexDesc.BindFlags = 0; //No bind flags allowed for staging
gpuTexDesc.SampleDesc.Count = 1;
gpuTexDesc.SampleDesc.Quality = 0;
gpuTexDesc.Usage = D3D11_USAGE_STAGING; //need staging flag for read
gpuTexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
gpuTexDesc.MiscFlags = 0;
тогда вы можете использовать CopyResource :
deviceContext->CopyResource(readTex, gpuTex);
Как только вы закончите, вы можете наконец получить доступ к данным текстуры для чтения, используя Карта
D3D11_MAPPED_SUBRESOURCE MappedResource;
deviceContext->Map(readTex, 0, D3D11_MAP_READ, 0, &MappedResource);
MappedResource предоставит вам доступ к данным в процессоре, как только вы закончите обработку, не забудьте Unmap ресурс.
deviceContext->Unmap(readTex, 0);