공부/Graphics, DirectX, 포트폴리오 구조

계산 셰이더(Compute Shader)

sudo 2022. 9. 27. 22:19

계산 셰이더(Compute Shader)

  • DirectX가 제공하는 프로그램 가능 셰이더 중 하나
  • 렌더링 파이프 라인 외부에 따로 존재한다 => 그럼에도 화면에 렌더링하지 않고도 GPU 자원에 읽고(Read) 쓰는게(Write) 가능하다
  • 병렬적 알고리즘 구현에 용이하다 => GPGPU 프로그래밍에 유용하다
  • 계산 셰이더의 출력 결과를 렌더링 파이프라인에 다시 바인딩 할 수 있다 

GPGPU(General Purpose GPU) 프로그래밍

GPU를 비그래픽 분야에 응용하는 것.

 

장점 : 많은 양의 데이터를 병렬적으로 처리할 수 있다 ex) 파티클 시스템

단점 : 그래픽 연산과 달리 GPU의 연산 결과를 다시 CPU로 보내야 한다(물론 GPU를 통한 연산으로 보는 이득이 더 크다)

 

 

지금은 계산 셰이더로 하는 계산들을 계산 셰이더가 지원되기 전에는 픽셀 셰이더로도 많이 처리 했다고 한다. 그렇다면 픽셀 셰이더와 비교했을 때 계산 셰이더의 장점은 뭐가 있을까?

픽셀 셰이더와 비교했을 때 계산 셰이더의 장점

  • 출력할 곳의 리소스를 임의의 위치로 쓸 수 있음 => 예를 들어 특정 RWStructuredBuffer에 쓴다고 하면 몇번째 인덱스에 쓸지 지정할 수 있다는 의미
  • Dispatch, numthreads 같은 기능과 동기화 기법으로 멀티 스레딩 환경에서 프로그래밍이 쉽다 => Dispatch는 계산 셰이더를 호출하는 함수. GroupMemoryBarrierWidthGroupSync()라는 쓰레드 동기화를 위한 함수이다. 이 함수는 모든 스레드가 이 함수 호출에 도달할 때 까지 나머지 모든 스레드는 블락한다.
  • 지정한 수의 스레드만 명시적으로 구동시켜서 퍼포먼스 최적화 가능
  • 렌더링 파이프라인 외부에 있으므로 디버깅이 용이하다? 렌더링 파이프라인처럼 드로우 콜 한다고 입력 조립기부터 -> 정점 처리 ->  래스터라이저 -> 픽셀 처리-> 출력 병합 이렇게 한번에 도는게 아니라 Compute Shader만 따로 실행하고 그 결과를 확인할 수 있으니까? 

단점

  • 계산 결과를 다시 CPU에서 접근해야 할 경우엔, 비디오 메모리(VRAM)에 담긴 결과를 시스템 메모리(RAM)로 복사해야하는 비용이 있다(ex. 스키닝 연산 결과의 Bone Matrix를 Socket에도 적용하기 위해 계산 셰이더 결과를 CPU로 가져와야 할 때)

https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-dispatch