Unity : Compute Shader에서 Failed to present D3D11 swapchain due to device reset/removed 해결 방법

Unity의 Compute Shader를 사용하면 수수께끼에 떨어지는 경우가 많습니다.

Compute Shader ( DirectCompute ) 에서는 현재 ( 2021 년 ) Runtime Error 적인 것을 토출 하지 않고 , 구문 에러 이외 의 런타임 에러 는 , 코멘트 아웃 을 하는 등 , 따를 필요 가 있습니다 . 이번에는 다음과 같은 오류가 발생하여 Unity Editor가 떨어졌습니다.

에러: Failed to present D3D11 swapchain




Failed to present D3D11 swapchain due to device reset/removed. This error can happen if you draw or dispatch very expensive workloads the GPU, which can cause Windows to detect a GPU Timeout and reset the device.  If you believe this error is due to built in Unity functionality, please submit a bug This is an unrecoverable error and the editor will shut down.

해결책



CPU측에서 p2gMassBuffer, sortedP2gMassBuffer를 생성하고 있었습니다만, P2GMass라고 하는 구조체로 작성한 Compute Buffer였지만↓,
GridSortCS.SetBuffer(this.rearrangeParticlesKernel.Index, "_P2GMassBuffer", p2gMassBuffer);
GridSortCS.SetBuffer(this.rearrangeParticlesKernel.Index, "_SortedP2GMassBuffer", sortedP2gMassBuffer);

GPU측에서는, MpmParticle이라고 하는 다른 구조체로의 Compute Buffer에 넣어져 버렸습니다↓.
StructuredBuffer<MpmParticle>   _P2GMassBuffer;
RWStructuredBuffer<MpmParticle> _SortedP2GMassBuffer;

따라서 다음과 같이 MpmParticle에서 P2GMass로 변경하면 오류가 발생하지 않습니다.
StructuredBuffer<P2GMass>   _P2GMassBuffer;
RWStructuredBuffer<P2GMass> _SortedP2GMassBuffer;

마지막으로



Compute Shader는 배열에서 index가 튀어나오거나 이번과 같은 다른 구조체의 Compute Buffer를 사용하고 있어도 에러를 가르쳐주지 않기 때문에, 코멘트 아웃으로 어디가 에러의 근원을 2분 탐색 방식으로 찾아 갑자기 마지막으로 좁혀진 행을 보고 육안인지 확인하거나 Compute Buffer를 C# 측에 대고 디버깅할 수밖에 없으므로 시간을 들여 차분히 디버깅합시다!
  • Twitter 계정
  • YouTube 계정
  • 좋은 웹페이지 즐겨찾기