상수 버퍼에 관련해 질문이 있습니다.
학습 내용에서 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) 질문과 메일이 너무 많이 와서 가끔 까먹고 누락하는 질문이 생기는데 양해 바랍니다.
Lighting 추가하고 나니 프레임이 많이 떨어지는데 원래 이런 건가요?
0
524
0
Deferred Rendering 에서 조명에 Culling이 일어나는 것 같습니다.
1
564
1
static_pointer_cast와 static_cast의 차이가 무엇인가요?
0
1353
1
Engine.lib 파일을 포함 불가
0
617
1
셰이더 VS_Main에서 행렬 곱해줄 때
0
491
2
1:05분 질문(1시간 5분)
0
303
0
오류가 발생합니다
0
480
1
Animation코드가 무한로딩에 걸리네요
0
350
0
fov 관련해서 질문이 있습니다
0
282
0
normal mapping Tangent Space 수학식 질문
0
388
1
커리큘럼 관련 질문 드립니다!
0
278
0
강의를 어떤식으로 들으면 될까요??
0
385
1
머티리얼과 텍스쳐, 셰이더를 따로 관리해도 되나요?
0
445
1
박스 메쉬 생성하는 함수에서 버텍스가 왜 24개인가요
0
245
1
복수개의 서로 다른 동영상을 Picture in Picture 형식으로 rendering하는 가장 최적의 방법이 궁금합니다.
0
263
0
애니메이션 쉐이더에서 행렬보간 부분에 대해 질문드립니다
0
233
0
assert 에서 _currentIndex 와 _elemtSize 를 비교하는게 이해가 잘 안되네요
1
248
1
DX 공부방법에 대해서 질문 있습니다.
0
643
1
Root Parameter 를 정의하는데 있어서 질문있습니다.
0
377
1
Client 콘솔창이 잠깐 켜졌다가 말아요
0
255
1
DirectX12 Root Signature : CBV관련 질문입니다.
0
353
1
뷰 변환 행렬 관련하여
0
635
2
강의 시작!
0
307
1
using namespace Microsoft::WRL;
0
275
1





