쉐이더는 GPU에서 실행되는 프로그램이다. DirectX와 같은 그래픽스 라이브러리에서 제공하는 렌더링 파이프라인은 GPU와 쉐이더를 이용하여 렌더링을 하기 위한 절차를 의미한다. CPU에서 실행되는 프로그램과 GPU에서 실행되는 프로그램은 서로 다른 메모리를 사용하기 때문에 필요한 데이터가 있다면 이를 CPU나 GPU로 넘겨주어야 한다. DirectX에서는 이렇게 전달되는 데이터를 리소스(resource)라고 부른다. DirectX에서 사용되는 일반적인 리소스의 종류는 크게 텍스처(texture)와 버퍼(buffer, 버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼 등)로 나눌 수 있다.
C++에서 실행되는 DirectX 라이브러리의 함수들은 CPU에서 실행되는 코드다. 따라서 GPU에 존재하는 텍스처나 버퍼와 같은 리소스에 직접 접근하는 것은 불가능하다. 대신 DirectX에서는 뷰(view)를 제공하여 CPU에서 GPU 메모리에 있는 데이터에 접근할 수 있게 해준다. 뷰는 이름 그대로 관점을 의미한다. 따라서 리소스 뷰(resource view)는 GPU 메모리에 있는 리소스를 바라보는 관점이라고 이해할 수 있다. 그 중에서도 쉐이더 리소스 뷰는 쉐이더에서 사용할 리소스를 바라보는 관점이라 할 수 있을 것이다.
쉐이더에서 사용할 수 있는 리소스는 인덱스/버텍스 버퍼, 컨스턴트 버퍼, 샘플러, 텍스처 등 그 종류가 매우 다양한데, 쉐이더 리소스 뷰는 그 중에서도 PSSetShaderResources
함수를 통해 전달되는 특정 리소스라고 할 수 있다.
주의사항
- GPU에 2D texture 리소스는 쉐이더에 따라서 렌더 타겟 뷰가 될 수도 있고 쉐이더 리소스 뷰가 될 수도 있다.
- 즉, 리소스를 바라보는 뷰에 따라 특정 쉐이더에서 해당 리소스를 어떤 방식으로 사용할 것인지를 구체화 할 수 있는 것이다.
- 여기서 주의해야 되는 부분은 하나의 쉐이더에서 특정 리소스를 렌더 타겟 뷰와 쉐이더 리소스 뷰로 동시에 지정할 수 없다는 것이다. 이는 GPU의 특징과 연관되어 있는 부분으로, 쉐이더 작업시에 멀티 스레딩 작업에 유리하도록 읽기와 쓰기 작업을 분리해 놓았기 때문이라고 이해하면 된다.
- 따라서 어떤 2D texture를 shader1에서 쉐이더 리소스 뷰로 사용하여 후처리 작업을 진행하고 그 결과를 화면에 렌더링하고 싶다면, shader1에서 작업한 결과물을 shader2에서 렌더 타겟 뷰로 사용하면 된다.
'그래픽스 > DirectX11' 카테고리의 다른 글
회전 행렬 유도 (0) | 2024.05.13 |
---|---|
조명 (0) | 2024.05.08 |
노멀 벡터 변환 (0) | 2024.05.08 |
쉐이더 만들기(버텍스, 픽셀) (0) | 2024.04.22 |
버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼 (0) | 2024.04.22 |