RTV and SRV

(TODO; 추후 수정 문서)

그래픽스 파이프라인에서 View는 GPU에게 리소스를 어떻게 사용할지, 어떻게 해석할지 알려준다.
이 글은 그 중 대표적인 RTV(Render target view) 그리고 SRV(Shader Resource View)에 대해 정리한다.

1. RTV는 GPU의 출력을 담는다

그래픽스 파이프라인의 끝 OM 단계와 연결된 RTV에는 렌더링 결과물이 담긴다. 백 버퍼와 포스트 프로세싱을
위한 중간 텍스처를 생성한다. 즉 다음 프레임에 띄울 화면과 띄우기 전 중간 단계를 저장한다.

D3D11_BIND_RENDER_TARGET

2. SRV는 GPU에 대한 입력을 담는다

셰이더 코드는 GPU에게 명령을 내리고 이때 필요한 자원을 담아서 전달해주는데 SRV가 사용된다.
RTV와 달리 OM뿐만 아니라 VS, PS, CS(Compute Shader)에도 바인딩된다. 여기서 말하는 자원은 보통
텍스처이며 diffuse, normal map도 여기에 포함된다. 이것들은 샘플링되거나 팔레트처럼 사용된다.

D3D11_BIND_SHADER_RESOURCE

3. 둘의 관계, Ping-Pong(Ring Buffer)

렌더링의 결과가 RTV에 담기고, 그것들이 다시 SRV을 통해 다음 프레임에 사용될 수 있다는 건 쉽게 이해된다.
사실 둘은 같은 리소스에 대해 용도를 다르게 보는(view) 것에 지나지 않는다. 완전히 같은 리소스에 대해서도
두 가지 뷰가 같이 존재할 수 있다. 그러나 렌더링 중에 샘플링하는 등 동시에 바인딩될 수는 없다.\

이걸 막기 위한 방법 중 하나가 Ping-Pong이다. 두 개의 리소스를 준비하여 하나는 입력(SRV), 하나는 출력(RTV)으로 쓰고
다음 패스에서 이를 교체한다. Blur 같은 post processing에는 필수적이다.

또 다른 방법은 Ring Buffer다. CPU와 GPU의 속도가 다르니 어느 한 쪽이 stall되는 경우를 피하기 위해 고안된
기술이다. 여러 개의 리소스 체인을 만들어서 돌려 쓴다. 상수 버퍼를 업데이트할 때 D3D11_MAP_WRITE_DISCARD를 사용해
Stall 없이 새 데이터를 쓸 수 있게 해준다.