그래픽스

Constant Buffer

춤추는수달 2021. 11. 10. 07:48

이번 글에서 할 것은 Constant Buffer를 사용해 저번에 그렸던 삼각형의 포지션을 조금 이동시키고, 색을 바꿔줄 것이다. 그렇다면 Constant Buffer란 무었일까 알아보도록 하자.


Constant Buffer가 무엇인지 알아보기 전에 아래 그림을 보자.

위 그림에서 1번은 CPU RAM에 있는 데이터, 즉 우리가 일반적으로 코드 상에서 다루는 데이터를 GPU의 RAM으로 보내고있다. 이때 GPU RAM에 Buffer의 형태로 저장되는데, Constant(리소스)를 저장하면 그것이 바로 Constant Buffer다~. 

그리고 더욱 빠른 연산을 위해 레지스터도 활용해야 한다. 2번 과정을 통해 Buffer의 주소값을 Register에 등록해서 사용할 수 있다. 

그리고 중요한 점은 1번 과정은 device를 통해 즉시 실행되지만, 2번 과정은 command list를 통해 작업들을 모아놨다가 일정 시점마다 한 번에 처리된다. 

 

그런데 위 1, 2 과정이 그냥 여기로 보내주세요~ 한다고 막 보내고 쓸 수 있는게 아니다. GPU에게 미리 어떤 레지스터를 어떤 용도로 사용하겠습니다~ 라고 약속을 해놓아야 한다. 이 약속을 기술해 놓은 것이 바로 Root Signature 이다.

아래 그림은 Root Signature를 표로 표현한 것이다.

보면 굉장히 어지러운데, 일단 왼쪽 위의 가장 큰 테이블만 보자.

이 테이블의 검은 1번 열은 API Bind Slot 라고 하는데, Signatrue 의 Index 라고 보면 된다. 즉, 그냥 행 번호이다. 

2번 열은 Register에 어떤 내용이 담길 것인가를 나타낸다. 

그리고 3번 열은 hlsl bind slot 이다. 그 내용을 어떤 레지스터에 담을 것인가를 나타낸다. 

예를 들어 3번째 행(2번 Signature)는 b0 레지스터에 root CBV를 담겠다는 뜻이다. 참고로 b0는 상수용으로 주로 쓴다.

여기서 CBV는 Constant Buffer View 이다. 위에 설명했던 Constant Buffer(리소스)의 View(descriptor)를 의미한다.

 

Root Signature의 내용에는 root constant, root descriptor, root table 세 가지를 넣어줄 수 있다.

root constant : 그냥 상수

root descriptor : resource의 주소

root table : 테이블 속의 테이블

주황색은 혼자 2번 3번열을 차지하고 있는게 보인다. 이것이 root table이다. Root Signature의 크기가 너무 커지면 성능상 좋지 않기 때문에, 공간을 절약하면서 많은 내용을 담을 수 있도록 한 것이다. 그림을 보면 직관적으로 이해가 될 것이다. 예를 들면 1번 Signature는 s0번 레지스터에 sampler, s1번 레지스터에도 sampler를 담겠다는 두 가지 내용이 들어있는 것이다. 

 

정리하자면 Constant Buffer를 사용하는 방법은 다음과 같다.

 

 1. 루트 시그니처 선언, 초기화 : 위에서 설명한 API Bind Slot, 내용, hlsl bind slot 를 명시하는 과정.

 2. GPU의 Buffer(GPU RAM)에 내용을 담기 : CPU의 Ram으로부터 GPU의 Ram으로 데이터 전송.  device를 통해 즉시 실행됨.

 3. GPU의 레지스터에 Buffer의 주소를 전송 : GPU의 Buffer의 Ram주소를 GPU의 레지스터에 담는 과정. cmd_list를 통해 모았다가 실행됨.

 

실제 예제에서는 

Transfrom(Vec4)를 mesh로 만들고 그걸 Constant Buffer에 push 하고, Buffer의 주소를 GPU의 레지스터에 넘겨주어 사용했다.

 

 

 

 

 

'그래픽스' 카테고리의 다른 글

Lighting  (0) 2022.01.02
Index Buffer  (0) 2021.12.08
장치 초기화  (0) 2021.10.13
프로젝트 세팅  (0) 2021.10.07
GPU외주와 렌더링 파이프라인  (0) 2021.10.06