인프런 커뮤니티 질문&답변
질문있습니다.
작성
·
152
·
수정됨
0
질문1)
D3D12_DESCRIPTOR_RANGE ranges[2] =
{
{ D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 5, 0, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND }, // b0 ~ b4
{ D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 5, 0, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND } // t0 ~ t4
};
CD3DX12_ROOT_PARAMETER rootParameters[1] = {};
rootParameters[0].InitAsDescriptorTable(_countof(ranges), ranges, D3D12_SHADER_VISIBILITY_ALL);
와 같이 루트시그니처에서 테이블의 사용범위를 넓게잡아두고
사용할때만 Shader 에서 buffer를 정의 ( ex :cbuffer WVP: register(b0 )해서
사용해주고있는데 테이블힙의 메모리 낭비를 제외하면 성능에 큰 악영향이 있을까요?
런타임에 터지거나 하는 오류는 현재 없는데 궁금해서 여쭤봅니다.
질문2)
제가 이해한게 맞나 궁금해서 질문드립니다.
질문1의 방식처럼 rootSignature 를 만들었다고 하였을때 ,
SetGraphicsRootDescriptorTable 함수인자에 핸들값을 넣을때
RootSignature 에서는 b0~b5 ,t0~t5 의 총10개를 사용한다고 서명했기떄문에 ,
DX에서 읽을때 10개단위로 읽어주기 때문에 선두에 있는 handle 값만 넣어주는 방식이 맞나요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
pakheae님의 질문에 답변드리겠습니다.
질문1) 루트 시그니처에서 데스크립터 테이블의 사용 범위를 넓게 잡아 두고 실제 사용 시에만 쉐이더에서 버퍼를 정의하여 사용하는 경우, 테이블 힙의 메모리 낭비는 있을 수 있지만, 실제 성능에 미치는 악영향은 크지 않습니다. 다만, 루트 시그니처와 데스크립터 테이블을 효율적으로 설계하여 사용하는 것이 좋으며, 이는 메모리 사용 최적화와 관리 측면에서 이점을 줄 수 있습니다.
질문2) 제공하신 이미지와 내용에 따르면, SetGraphicsRootDescriptorTable 함수의 인자로 핸들 값을 넣을 때, RootSignature에서 선언한 f b0~b5, t0~t5까지 총 10개의 데스크립터를 사용한다고 가정했을 때, DX는 이를 10개 단위로 읽어 들이는 방식이 맞습니다. 이때 선두에 있는 핸들 값을 기준으로 연속된 메모리 블록을 참조하여 필요한 정보를 가져오게 됩니다. 이미지 설명을 바탕으로 한 설명이 정확하게 해당 사핞을 이해하셨습니다.
도움이 되었기를 바랍니다. 추가적인 질문이나 궁금하신 점이 있으시다면 언제든지 문의해 주세요.





