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이 그 형식으로되어있어 데이터로 아무 것도 할 수 없습니다.
- CPUFlags를 설정할 수 없기 때문에 액세스 할 수 없습니다.
- 소스와 대상이 동일한 자원 유형이 아닌 경우
CopyResource
이 작동하지 않기 때문에 복사 할 수 없습니다.
질문은이 데이터를 사용하는 방법입니다.
최종 목표가 해당 데이터를 백 버퍼로 전송하고 Present()를 호출하는 경우이 시나리오가 적용됩니까? 그렇다면 GPU에서 CPU로 데이터를 이동 한 다음 다시 백 버퍼로 다시 이동하는 방법을 찾아야합니다. 그것은 사람들이 색상 변환과 같은 멍청한 작업을 위해 GPU를 사용하는 방법을 궁금하게 만듭니다. – moose
물론 CPU가 아무런 관심이 없다면 당연히 아닙니다. 백 버퍼가 UAV가되도록 스왑 체인을 만들 수 있으며, 'RWTexture2D'를 사용하여 계산을 직접 수행 할 수 있습니다. 보다 편리하면 계산 출력을 분리하여 다른 계산 또는 그리기를 사용하여 백 버퍼로 다시 복사 할 수 있습니다. 텍스쳐 읽기 나 쓰기를 할 때 메모리 효율이 떨어지기 때문에 버퍼를 사용하지 않는 것이 좋습니다. – galop1n
나는 일반적으로 당신이 말하는 것을 이해하지만 DirectX 코드로 변환하는 것은 악몽이다. 왜냐하면 나는 DirectX에 관해서 무식하기 때문이다. 내가 제안한대로 스왑 체인을 만들려고 시도 하겠지만, HLSL에서'RWTexture2D' (또는'Texture2D')를 사용하는 방법을 모른다. 새로운 질문을 할 수 있으므로 평판을 얻을 수 있습니다. 사실 현재 swapchain을 사용하는 방법은'DXGI_USAGE_RENDER_TARGET_OUTPUT'이므로 스왑 체인을 만드는 방법을 모른다. 'DXGI_USAGE_UNORDERED_ACCESS'로 변환하면 프리젠 테이션에 사용할 수 있습니까? – moose