2017-04-03 5 views
0

나는이 형식으로 출력 버퍼를 가지고 :일단 컴퓨터 쉐이더가 완료되면 데이터를 사용하는 방법은 무엇입니까?

D3D11_UNORDERED_ACCESS_VIEW_DESC descView; 
descView.Format      = DXGI_FORMAT_UNKNOWN; 
descView.ViewDimension    = D3D11_UAV_DIMENSION_BUFFER; 
descView.Buffer.FirstElement  = 0; 
descView.Buffer.NumElements   = rgbaGPUBuffer.ByteWidth/rgbaGPUBuffer.StructureByteStride; 
descView.Buffer.Flags    = 0; 

버퍼의 사용이 D3D11_USAGE_DEFAULT해야하며 CPUAccessFlags가 설정할 수 없습니다 :

D3D11_BUFFER_DESC rgbaGPUBuffer; 

rgbaGPUBuffer.ByteWidth    = width * height * 16; // 4 * 4 floats (RGBA) 
rgbaGPUBuffer.Usage     = D3D11_USAGE_DEFAULT; 
rgbaGPUBuffer.BindFlags    = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; 
rgbaGPUBuffer.CPUAccessFlags  = 0; 
rgbaGPUBuffer.MiscFlags    = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; 
rgbaGPUBuffer.StructureByteStride = 4; // shader will output one rgba component by one 

내가 정렬되지 않은 액세스 볼 수 있습니다. 따라서 액세스보기 형식은 DXGI_FORMAT_UNKNOWN이어야합니다. 계산 쉐이더가 끝나면 실제로 출력 버퍼는 DXGI_FORMAT_R8G8B8A8_UNORM 형식을 유지한다는 것이 아이러니입니다. 렌더링 대상 swapchain이 그 형식으로되어있어 데이터로 아무 것도 할 수 없습니다.

  1. CPUFlags를 설정할 수 없기 때문에 액세스 할 수 없습니다.
  2. 소스와 대상이 동일한 자원 유형이 아닌 경우 CopyResource이 작동하지 않기 때문에 복사 할 수 없습니다.

질문은이 데이터를 사용하는 방법입니다.

답변

0

이들은 GPU가 쓸 수있는 리소스와 CPU가 읽을 수있는 리소스 사이의 장벽입니다.

gpu 작업에서 CPU 작업으로 몇 프레임의 대기 시간을 추가하지 않으면 리드 백이 필요합니다 (수행을 중단해야합니다). 수행하는 유일한 방법은 D3D11_USAGE_STAGING 풀에서 gpu 바인딩없이 별도의 리소스를 생성하는 것입니다. CopyResource을 실행하여 GPU 작업을 CPU 액세스 가능 자원으로 전송하십시오.

+0

최종 목표가 해당 데이터를 백 버퍼로 전송하고 Present()를 호출하는 경우이 시나리오가 적용됩니까? 그렇다면 GPU에서 CPU로 데이터를 이동 한 다음 다시 백 버퍼로 다시 이동하는 방법을 찾아야합니다. 그것은 사람들이 색상 변환과 같은 멍청한 작업을 위해 GPU를 사용하는 방법을 궁금하게 만듭니다. – moose

+0

물론 CPU가 아무런 관심이 없다면 당연히 아닙니다. 백 버퍼가 UAV가되도록 스왑 체인을 만들 수 있으며, 'RWTexture2D'를 사용하여 계산을 직접 수행 할 수 있습니다. 보다 편리하면 계산 출력을 분리하여 다른 계산 또는 그리기를 사용하여 백 버퍼로 다시 복사 할 수 있습니다. 텍스쳐 읽기 나 쓰기를 할 때 메모리 효율이 떨어지기 때문에 버퍼를 사용하지 않는 것이 좋습니다. – galop1n

+0

나는 일반적으로 당신이 말하는 것을 이해하지만 DirectX 코드로 변환하는 것은 악몽이다. 왜냐하면 나는 DirectX에 관해서 무식하기 때문이다. 내가 제안한대로 스왑 체인을 만들려고 시도 하겠지만, HLSL에서'RWTexture2D' (또는'Texture2D')를 사용하는 방법을 모른다. 새로운 질문을 할 수 있으므로 평판을 얻을 수 있습니다. 사실 현재 swapchain을 사용하는 방법은'DXGI_USAGE_RENDER_TARGET_OUTPUT'이므로 스왑 체인을 만드는 방법을 모른다. 'DXGI_USAGE_UNORDERED_ACCESS'로 변환하면 프리젠 테이션에 사용할 수 있습니까? – moose