• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

상수 버퍼에 관련해 질문이 있습니다.

22.01.07 04:00 작성 조회수 154

0

학습 내용에서 Constant Buffer와 Root Signature 강의 두개를 보고 이해가 잘 안가서 질문드립니다.

먼저 Constant Buffer 강의에서는 Resource의 모음집인 _cbvBuffer에 데이터를 넣고 커맨드큐에 0 또는 1번 레지스터가 그 주소를 가리키라고 요청했는데,

이 때 이 방식이 가능한 이유는 Root Parameter를 정해주는 단계에서 InitAsConstantBufferView에서 Shader Visible이 ALL이기 때문인가요? 아니면 _cbvBuffer의 타입이 D3D12_HEAP_TYPE_UPLOAD이기 때문인가요?

또한  D3D12_HEAP_SHADER_VISIBLE이 아닌 D3D12_HEAP_FLAG_NONE인 이유가 있나요?

다음 질문입니다.

Root Constant 방식은 각 b0 b1 레지스터가 GPU 메모리에 담긴 정보를 가리키는 형태라고 말씀하셨는데,
Descriptor Table을 사용하게 되면 b0 b1 ... b4 레지스터가 Descriptor Heap에 담긴 주소를 가리키게 되는건가요? 아님 다른 방식인가요?

다음 질문입니다.

Descriptor Table의 방식을 정리해보면 다음과 같다고 이해하고 있습니다.

Constant Buffer의 내용을 Constant Buffer View가 가리키고, 그 내용을 Shader Visible인 Descriptor Heap이 가리키고, 그걸 b0, b1, b2... 에 놓는다. 라고 이해하고 있는데

그냥 Constant Buffer의 내용을 Shader Visible인 Descriptor Heap이 가리키게 하면 한 단계가 더 줄지 않나 싶어서 여쭤봅니다.

마지막 질문입니다.

Root Constant 방식을 사용하게 된다면 중복으로 인해 데이터가 덮어씌워질 수 있으니 각 오브젝트가 Constant Buffer를 사용할 때 다른 index를 사용하게 하여 데이터가 덮어씌워지는거를 피했는데,
오브젝트가 늘어나면 늘어날수록 Constant Buffer 속 _cbvBuffer의 크기가 늘어난다고 이해하고 있습니다.

그럼 Descriptor Table 방식은 오브젝트가 늘어나면 늘어날수록 Descriptor Heap의 크기가 늘어나고, 동시에 Constant Buffer View의 크기도 늘어나는건가요?

 

따로 답변을 받아도 이해가 잘 가지 않는다면 추가적인 공부 후에 또 정리해서 질문드려도 괜찮은거겠죠..?

 

 

답변 1

답변을 작성해보세요.

1

답변이 누락된걸 오늘 확인했네요.
뒤늦게 답변을 드리자면,

세부적인 옵션은 지금 단계에서 중요하지 않고,
반복 학습을 하는 회차가 되면 그때가서 MSDN을 참고하시기 바랍니다.

참고로 HEAP_TYPE_UPLOAD는 버퍼에다가 데이터를 복사할 수 있게 하는 옵션입니다.
(이를테면 나무와 같이 한 번 세팅되면 이후
절대 바뀔 일이 없는 버퍼라면 굳이 TYPE_UPLOAD로 할 필욘 없겠죠.)
Root Parameter에서 설정한 InitAsConstantBufferView는 예상하신 것이 맞습니다.

https://docs.microsoft.com/ko-kr/windows/win32/direct3d12/root-signatures-overview
- Root Constant
- (Descriptor) Table
- Descriptor

위 세가지 방식은 각기 다릅니다.
Root Constant는 상수를 때려박고,
Table은 다른 테이블을 참조하고
Descriptor는 다른 버퍼 (이를테면 CBV)를 참조합니다.

Root Constant는 가장 직관적이고
상수값(ex. float)를 넣어줄 수 있지만
Root Signature 용량 한계로 인해 많이 사용할 수가 없습니다.
https://docs.microsoft.com/ko-kr/windows/win32/direct3d12/root-signature-limits

따라서 Descriptor나 Table 방식을 혼용하는 것인데
이 경우 버퍼에 있는 내용이 덮어써지는 것을 방지하기 위해
여분의 버퍼를 여러개 만들어놓고 
각기 영향을 주지 않게 유도하였습니다.

사실 자세한 정리는 MSDN에 잘 나외 있으니 꼭 한 번 살펴보시기 바랍니다.
PS) 질문과 메일이 너무 많이 와서 가끔 까먹고 누락하는 질문이 생기는데 양해 바랍니다.